Data Processing Agreement
Version 2026.06.4 · Between AttachKit (Processor) and Customer (Controller). Use this as the DPA between your organization and ours. Print to PDF and sign on both sides; we'll countersign on request via our contact form.
1. Background
Customer uses AttachKit(the "Service") and in doing so may have us process Personal Data on Customer's behalf. This DPA forms part of the agreement between Customer and AttachKitand sets out the terms governing Processor's processing of Personal Data as a processor under the GDPR / UK GDPR.
2. What we process (subject matter + duration)
- Subject matter: Provision of the AttachKit Service (PDF fill, sign, redact, send-to-sign, verify, scan, compare).
- Duration: For as long as Customer maintains an active account or until Customer requests deletion (whichever is earlier) — except for send-to-sign and QR-phone-handoff documents, which Processor stores on a fixed 7-day expiry from creation and deletes by a daily sweep. That period runs independently of the account: it is not extended by an active account, and not shortened by completing the request or by deleting the account (see Section 6).
- Nature + purpose: Hosting authentication, subscription state, signing-flow metadata. Processor does not process PDF contents server-side except in two cases Customer explicitly invokes. First, send-to-sign and the QR phone handoff: the document is encrypted in the browser and its ciphertext is uploaded and stored by Processor for the period above — this is document bytes at rest on Processor's systems, and it involves no AI. Processor cannot read that ciphertext without a key it does not store, but does not represent that it is incapable of obtaining one (see Annex 1). Second, a server-side AI feature (auto-fill mapping, PII detection for redaction, clause review, document drafting, field-help explanations, library cited answers, document summaries/Q&A/translation, the PDF agent's planning step, or whole-document translation): only the necessary slices — never the PDF file itself — are sent to our model provider and not retained beyond the request. Outside these two, document bytes do not leave Customer's browser.
- Categories of data: Customer's and end users' email addresses, names, profile fields voluntarily entered, signature image data, payment metadata (via Stripe), and — for send-to-sign and the QR phone handoff — the document itself as client-side-encrypted ciphertext plus its IV and filename. Processor treats that ciphertext as personal data rather than out-of-scope pseudonymous data, because on the default send path the decryption key transits Processor and the email sub-processor named in Section 4 and remains embedded in the delivered message (see Annex 1).
- Categories of data subjects: Customer's end users + their counterparties who are sent a sign request.
3. Processor obligations
- Process Personal Data only on Customer's documented instructions (the Service contract + this DPA + Customer's configuration).
- Ensure personnel with access are subject to confidentiality.
- Implement appropriate technical + organizational measures (see Annex 1).
- Assist Customer in responding to data subject requests (access, rectification, erasure, restriction, portability, objection). Our admin panel provides a GDPR export + delete flow we can invoke on Customer's behalf within 30 days of request.
- Notify Customer without undue delay (and at most within 72 hours) of a personal data breach affecting Customer's data.
4. Sub-processors
Customer authorizes Processor to engage the following sub-processors:
- Google LLC (Google Cloud) — application hosting (US, EU regions available)
- Neon, Inc. — Postgres database hosting
- Resend (Plus Five Five, Inc.) — transactional email. Note that a send-for-signature notification carries the sign link, and in the default (fragment) mode that link contains the AES key for the encrypted document; Resend therefore processes that key in order to deliver the message. Max zero-knowledge sends carry a keyless link (see Annex 1).
- Stripe, Inc. — payment processing
- Anthropic, PBC (the Claude API; United States) — AI processing (auto-fill mapping, PII detection for redaction, clause review, document drafting, field-help explanations, library cited answers, document summaries/Q&A/translation, the PDF agent's planning step, and whole-document translation). Retention is bounded per Anthropic's commercial API terms (no training on data sent through the API); we don't pass data unless Customer invokes an AI feature.
- Google LLC (the Gemini API; United States) — an alternative AI processor Processor may enable for these features and no others: clause review, document summaries/Q&A/translation, and whole-document translation. Every other AI feature above calls Anthropic directly and cannot be routed to a different provider. When enabled, only extracted text is sent (never the document file), on the paid Gemini API tier, which does not train on data sent through it; not engaged unless Customer invokes one of those features and Gemini is the configured provider.
- Plausible Insights OÜ — privacy-focused web analytics. Cookieless, no cross-site tracking, no third-party fingerprinting. Aggregate page-view counts only. Active only when
NEXT_PUBLIC_PLAUSIBLE_DOMAINis configured on our deployment. - Google LLC (Google Drive) / Dropbox, Inc. — optional cloud import, off by default. Active only when
NEXT_PUBLIC_GOOGLE_CLIENT_ID/NEXT_PUBLIC_GOOGLE_API_KEY(Drive) and/orNEXT_PUBLIC_DROPBOX_APP_KEY(Dropbox) are configured on our deployment. When an end user chooses to import a file, the file is fetched directly from the provider into the user's browser — Processor's servers never receive the document bytes. The provider receives the user's authenticated request and file-listing metadata for that import. Strictly speaking these act as the end user's own data source rather than Processor's sub-processors, but listed here for transparency. - Google LLC / Cloudflare, Inc. (STUN servers) — NAT-traversal helpers for the peer-to-peer co-sign and live-review sessions. Active only while those sessions are in use. They receive the participant's IP address to establish the peer connection and never receive document content (data flows peer-to-peer between participants, not through these servers).
"Local AI mode" — two different settings, with opposite egress. Two per-device settings ship under that one name. They are not variants of one feature, and the name does not tell Customer which is which: they differ in where the request goes, which is the only reliable way to read them.
The setting in the sign + draft tools (Counsel Mode). On the flows that offer it, the end user's browser posts straight to an Ollama instance the end user runs; Processor's servers are never contacted and receive nothing. No Personal Data leaves the device on those flows, and no AI sub-processor is invoked. Intentionally out of the sub-processor list — that model runs on the end user's own machine (Customer infrastructure) and Processor engages no one to run it. As with the cloud-import entry above, this is the end user's own infrastructure rather than a sub-processor of Processor's; it is not processing Processor performs at all.
The setting in account settings (sent to us as an X-Use-Local-Ai request header). This one does not keep Personal Data on the device. The request comes to Processor exactly as it otherwise would; what the setting changes is which model answers it, not whether a request happens. Where the deployment has a self-hosted model configured (OLLAMA_BASE_URL), Processor hands the text to that model instead of the third-party AI provider — but that model is Processor's own, not Customer's. Despite the shared name, nothing about this setting causes inference to run on Customer infrastructure. Where the deployment has no such model configured, the features that check the setting decline rather than quietly falling back to the cloud. Also out of the sub-processor list, but for a different reason — not because it is Customer-controlled infra, which it is not: a model Processor self-hosts introduces no third party, so that inference is processing Processor performs itself, already covered by this DPA. Were the setting ever pointed at a model a third party operates, that third party would be a new sub-processor and the notice commitment below would apply.
Neither setting covers every AI feature, and we deliberately do not print which features each one covers: that list has been written down wrong twice, which would make a per-feature claim here the least trustworthy sentence on this page. Only the narrowing direction is safe to state — with the account setting on, the PDF agent and whole-document translate refuse to run rather than fall back to the cloud (their text never leaves the page), while any feature that does not check that setting reaches the AI sub-processor exactly as described above. For the build Customer is actually running, DevTools → Network is authoritative.
Processor will notify Customer at least 30 days in advance of any new sub-processor, giving Customer the right to object.
5. International transfers
Where Personal Data is transferred outside the EEA/UK, transfers are governed by the EU Standard Contractual Clauses (Module 2 — controller to processor) or the UK International Data Transfer Addendum, as applicable. Processor will assist Customer in completing transfer impact assessments on request.
6. Deletion + return
On termination, Processor will delete or return all Personal Data within 30 days, unless retention is required by law. Customer can trigger immediate deletion via the in-app GDPR delete flow, which cascades across profile, signatures, subscriptions, sessions, and related tables.
Send-to-sign and QR-phone-handoff documents specifically. The stored ciphertext is deleted, not merely de-identified — for a document, the stored bytes ARE the Personal Data, so redacting the metadata around them would not be erasure. Three routes reach it: the sending user deletes the request themselves (available on a completed request, not only a pending one); the GDPR delete flow above removes every request that user sent; and failing both, every request expires 7 days after creation regardless of status and is deleted by a sweep that runs once a day, so it goes at expiry or within a day of it. Where the data subject was a recipient rather than the sender, Processor redacts their address out of the sending Customer's request and leaves that request standing — a recipient's Art. 17 request is not authority to destroy another controller's document.
7. Audits
On reasonable notice (minimum 30 days) and at Customer's expense, Processor will make available the information necessary to demonstrate compliance with this DPA and allow for audits by Customer or a third-party auditor mandated by Customer. Processor may satisfy this obligation by sharing relevant SOC 2 reports or equivalent third-party attestations from its sub-processors.
Annex 1 — Technical + Organizational Measures
Reproduced here in summary; the full per-control breakdown, cryptography stack, and verification steps live on our security page.
- TLS 1.2+ in transit, AES-256 at rest (sub-processor level for Postgres + filesystem; client-side AES-GCM for PDF payloads in the send-to-sign flow).
- Send-to-sign is encrypted client-side (AES-GCM-256). Of the document itself Processor stores only ciphertext and its IV (alongside request metadata), and Processor never persists the decryption key — it is written to no database column and to no log.
- Key handling differs by mode, and Processor states the weaker case rather than the stronger one. In the default mode the key travels in the sign link's URL fragment; because Processor sends that link by email on Customer's behalf, the sending browser transmits the link — key included — to Processor, which relays it to the email sub-processor named in Section 4 and thence to the recipient's mailbox. The key is therefore in transit through Processor's systems on each send, resend, and multi-signer forward. Processor writes it to no database column and to no log, but the delivered message itself embeds the key in that link, and the message remains retrievable from Processor's account with the email sub-processor for as long as that sub-processor retains it — a period that sub-processor governs, and that this DPA does not fix. Processor accordingly makes no representation that it is technically incapable of accessing a decryption key, and this DPA should not be read as giving one. In Max zero-knowledge mode — available where the recipient has published an ECDH public key — the key is wrapped to each recipient and the link carries no key, so Processor receives no usable key at any point: it stores only the per-recipient wrapped blob, which only that recipient's private key (held in their browser, never uploaded) can unwrap.
- Authentication via email-OTP + passkeys; admin actions audited to an append-only log surfaced at /admin/audit.
- IP-block list + rate limits on signup-vector endpoints; feature kill switches to pause individual surfaces.
- Bounce + complaint suppression via Resend webhook; deliverability telemetry surfaced per-user.
- Regular dependency upgrades + automated CI (lint + typecheck + build + e2e on every push).
Need a signed countersignature or a redlined version? Terms · Privacy · Contact