Skip to content
Trust Center

The real controls protecting your documents.

What DocTalk actually does to keep your uploads private, isolated, and unused for model training. And openly, what we haven't certified yet.

Control summary
AES-256

Encryption

TLS 1.2+

Transport

No training

Retention stance

Compliance badges are not claimed unless they are actually audited.


01

Encryption & transit

AES-256 encryption at rest

Uploaded documents are written to MinIO with SSE-S3 server-side encryption by default. Production (Railway) runs MinIO with KMS enabled so SSE-S3 is always applied. In unsupported self-hosted deployments without KMS, MinIO may fall back to unencrypted writes — that is a deployment choice, not a silent downgrade in production.

backend/app/services/storage_service.py · upload_file()

TLS 1.2+ in transit

Every network hop — browser to Vercel edge, edge to Railway backend, backend to LLM providers — uses TLS. HSTS with max-age=63072000 and includeSubDomains is set on the apex domain.

No training on your data

DocTalk routes LLM calls through OpenRouter. Your documents and questions are never used by DocTalk to train models. Provider-side retention depends on the upstream model (DeepSeek / Mistral) — for guaranteed zero retention we rely on OpenRouter's account-level privacy setting (operational control, not yet code-enforced at the request level), and can tighten further with a provider allow-list on request.

02

Ingest safety

Magic-byte file validation

Uploads are validated against file signature bytes, not file extensions. A .pdf with an executable payload inside is rejected at ingest — you cannot trick the parser by renaming a file.

backend/app/services/upload_service.py · magic-byte check

SSRF protection on URL ingestion

When you drop a URL to summarize, the backend validates the target against an allow-list of public hosts and rejects any request to private IP ranges, link-local addresses, or cloud metadata endpoints (169.254.169.254, etc).

backend/app/core/url_validator.py

Rate limits on anonymous endpoints

Public endpoints (shared views, anonymous reads) have per-IP rate limits. The real client IP is forwarded from the Vercel edge to our backend with an HMAC-SHA256 signature bound to a per-request timestamp, so the backend can authenticate the proxy origin and reject header-spoofing attempts. This is not a defense against an active wire-level MITM — TLS handles that layer. Authenticated users bypass IP rate limiting.

backend/app/core/rate_limit.py · shared_view_limiter, anon_read_limiter


03

Your data, your control

Full data export

From your Profile → Account you can export all your documents and session data. The export includes everything DocTalk stores about you, in portable formats.

Account deletion

You can delete your account from Profile → Account. All documents, sessions, chat history, embeddings, and billing records are removed; the account is not recoverable after deletion.

User isolation

Every document and session is scoped to its owner's user_id at the database and vector-store layer. There is no shared namespace, no org-wide collection by default, and the isolation is enforced at query time — not just at render time.

04

What we don't have yet

SOC 2 Type II
Not audited

We are a small team without the engineering spend for a full SOC 2 audit yet. The underlying controls are in place; the certification is not.

HIPAA
Not compliant

DocTalk is not a HIPAA-covered business associate. If you handle Protected Health Information, do not upload PHI until we announce BAA support.

Enterprise SSO / SAML
Not available

Individual OAuth (Google, Microsoft) and magic-link email sign-in only. Enterprise SSO is on the roadmap but not shipped.

On-premise / air-gapped deployment
Not offered

DocTalk is SaaS only. Self-hosted is not currently supported.

Report a security issue

Responsible disclosure welcomed. We reply to every vulnerability report within 72 hours.