Security

Safe, private, and verifiable.

Every claim on this page is something we can show you — not just tell you. Facts, dates and named things, for the person filling in the questionnaire.

Illustration: the rii.link routing core sealed behind its security boundary — TLS in front, abuse checks, the tenant-partitioned database, EU-first handling with visitor IPs anonymised before storage, and the request log.

The request path

Five hops. Each one sealed.

Not the data path — the security boundary. See how a click becomes a dashboard row on /analytics; here's what happens to the request itself, hop by hop.

TLS handshakesealed · https · auto-issued certs

Links on your domains are served over HTTPS, with certificates issued and renewed automatically — nothing for you to upload, nothing to forget to renew.

GET https://go.acme.com/launch · certificate: issued automatically · renewal: automatic
Abuse checksealed · honeypot · timing · turnstile

Public forms pass named bot checks — honeypot fields, render-to-submit timing, and a Turnstile check on every form that sends email or reaches our team (on the shortener, only when a submission looks automated). The redirect itself skips all of it.

# public forms only — never the redirect
honeypot: empty ✓ · render→submit: 3.4 s ✓ · turnstile: passed ✓
Lookupsealed · o(1) · config read-only

The path resolves with O(1) reads from Redis. The routing service only reads link configuration — changes arrive solely through the API, never from the redirect path.

GET go.acme.com/launch → 302 https://acme.com/launch (redis read · config never written here)
Tenant boundarysealed · tenant_id on every row

Every tenant-owned row carries a tenant_id, and queries are scoped to it at the repository layer — isolation is built into the data layer, not left to code review.

SELECT dest FROM links WHERE slug = $1 AND tenant_id = $2 — generated by the repository layer, not optional
Responsesealed · logged vs discarded

The redirect goes back in milliseconds. Analytics keeps request metadata, but the visitor IP is truncated to a /24 IPv4 or /48 IPv6 network prefix before durable storage.

kept →
utc timestamp
country = DE
device = mobile
dropped →
raw ip, after geo lookup
fingerprints — never built
third-party cookies — none

abuse checks never touch the redirect hot path ↓

monitored on /statuslive numbers ↗
Routingp50 / p99 · 60 s probe
APIuptime
Dashboarduptime
MCP serveruptime
Emailuptime
Infrastructure & availability

Boring, on purpose.

Separate read and write paths, a public status page, and a 99.99% SLA on Enterprise — availability is a security property here, not a marketing one.

99.99% uptime SLA in every Enterprise agreement — the terms are spelled out there
Routing and the write API run as separate services — link config is only read on the redirect path
Public status page with live latency and incident history — see live status at rii.link/status
Data protection

What we keep, and how.

Per data type — not a blanket claim — plus the transport and retention facts a questionnaire actually asks for. EU-first — visitor IPs anonymised before storage.

Data — per type
Routing configurationapi → routing

Paths, destinations, rules — written by the API, read by routing.

Click eventsIP /24 · /48

Country, device, browser, referrer and UTM tags — IP truncated first.

Object storageprocessor list ↓

Generated QR codes and uploaded assets.

every processor and its country · privacy policy §7

Transport & retention — spec sheet
In transitHTTPS on rii.link and on your domains — certificates issued and renewed automatically
Click eventsCountry derived first; IP truncated to /24 (IPv4) or /48 (IPv6) before durable storage
Deleted linksRemoved from routing on delete; API slugs stay reserved 30 days
Click historyKept at least your plan's window — nothing is purged early
API keysStored as SHA-256 hashes — the key is shown once, at creation

We do not sell click data. Not aggregated, not “anonymized”, not ever.

Application security

The parts your pentester greps for.

One fact per line — the implementation detail lives on /developers.

rii/app — security facts
auth30-minute access JWTs · refresh issues a fresh token pairdocs →
data layerevery query ships WHERE tenant_id = $ctx — enforced by the repository, not by reviewdocs →
api keysSHA-256 hashed at rest · plaintext shown once · revocabledocs →
# no passwords in api calls · keys revocable instantly, self-serve
Abuse & link safety

What’s live, by name.

Named mechanisms only. Where something isn’t live yet, it says so — this page never implies. Seen a bad link? Report it.

Bot protection & filteringWrite and form abuse controls run before acceptance; known crawlers, preview agents and uptime monitors are classified after redirects and excluded from customer analytics.Live
Rate limitingPer API key, per IP for unauthenticated calls — 60 req/min on Free, 600 on Premium.Live
Malicious-URL scanningDestinations are checked against Google Web Risk when a link is created or edited. Flagged URLs are refused; anonymous links and links on rii.link's shared domains are refused while the check can't run.Live
Destination blocklistURLs and domains we block are refused when a link is written, and routing won't redirect to them.Live
TakedownAn operator can take a link down; routing stops serving it immediately.Live
Abuse reportsAnyone can report a link without an account. Reports go to a person on our team for review.Live
Compliance & certifications

Status, not spin.

Not certified means not certified — never hidden, never dressed up as more.

SOC 2Not certified

We hold no SOC 2 report today and don't claim a date for one. Ask for our security documentation instead.

DPA — GDPR / DSGVOVia sales

Standard template with processor terms and the subprocessor list — request from sales@rii.link, countersigned in days.

Subprocessors — the whole list
Railwayhosting for the API, routing service and dashboardSCCs
Vercelhosting for this websiteSCCs
Vercelbot detection for form submissionsSCCs
Hetzner Online GmbHthe server that receives forwarded mail—
Hetzner Online GmbHTLS certificates and traffic termination for custom domains—
Twilio SendGridtransactional email (verification, password reset, forwarding relay)SCCs
Amazon Web Servicesstorage for generated QR codes and uploaded assetsSCCs
Cloudflarebot detection for form submissionsSCCs
Anthropicthe AI model behind the dashboard assistantSCCs
Google Cloud (Web Risk)checking link destinations for malware and phishingSCCs
Slackinternal alerts to our team about abuse reports and unsafe linksSCCs

ip-to-country lookups use a locally hosted database — ip addresses are not sent to a third party. countries per processor: privacy policy §7.

Responsible disclosure

security.txt, published.

RFC 9116, at the well-known path — so a researcher who finds something reaches a human in minutes, not a contact form.

Reports acknowledged within 72 hours — by an engineer, not an autoresponder
Good-faith research is safe here — no legal threats for responsible reports
rii.link/.well-known/security.txt
Contact: mailto:security@rii.link
Expires: 2027-08-09T00:00:00.000Z
Encryption: https://rii.link/.well-known/pgp-key.txt
Preferred-Languages: en, de
Canonical: https://rii.link/.well-known/security.txt
Policy: https://rii.link/security#disclosure
# this preview is the spec — the real file ships with the page
Talk to us

Mid-security-review?

Send the questionnaire — the engineers who built the request path answer it, with the DPA and subprocessor list ahead of the call.

SLA, migration and rollout live on /solutions/enterprise — including the 99.99% uptime SLA on Enterprise.