GDPR Data Request Form — Free Privacy Rights Request Widget
GDPR Data Request Form · Forms · Plain HTML, CSS & JS · Live preview
Copy & paste
Source Code
<div class="gd-card">
<form id="gdForm" class="gd-form">
<h2>Data privacy request</h2>
<p class="gd-sub">Exercise your rights under GDPR. We'll confirm your identity before processing.</p>
<fieldset class="gd-fieldset">
<legend>What would you like to do?</legend>
<label class="gd-radio">
<input type="radio" name="gdType" value="Access my data" checked />
<span><strong>Access my data</strong><small>Get a copy of the personal data we hold about you.</small></span>
</label>
<label class="gd-radio">
<input type="radio" name="gdType" value="Delete my data" />
<span><strong>Delete my data</strong><small>Request erasure of your personal data ("right to be forgotten").</small></span>
</label>
<label class="gd-radio">
<input type="radio" name="gdType" value="Correct my data" />
<span><strong>Correct my data</strong><small>Fix inaccurate or incomplete personal data.</small></span>
</label>
<label class="gd-radio">
<input type="radio" name="gdType" value="Export my data" />
<span><strong>Export my data</strong><small>Receive your data in a portable, machine-readable format.</small></span>
</label>
</fieldset>
<div class="gd-field">
<label for="gdEmail">Confirm your account email</label>
<input type="email" id="gdEmail" placeholder="[email protected]" required />
<p class="gd-error" id="gdError" hidden>Enter the email address associated with your account.</p>
</div>
<button type="submit" class="gd-submit">Submit request</button>
</form>
<div class="gd-confirm" id="gdConfirm" hidden>
<div class="gd-check">✓</div>
<h2>Request received</h2>
<p class="gd-confirm-detail" id="gdConfirmDetail"></p>
<div class="gd-timeline-note">
<strong>What happens next</strong>
<p>We'll respond within <strong>one month (30 days)</strong> of receiving your request, as required under GDPR. For complex requests, this may be extended by up to two further months — we'll notify you if that applies.</p>
</div>
<button type="button" class="gd-restart" id="gdRestart">Submit another request</button>
</div>
</div>*{box-sizing:border-box}
body{font-family:system-ui,-apple-system,sans-serif;background:#0b0d13;color:#e7eaf3;padding:32px 16px;display:flex;justify-content:center;min-height:100vh;align-items:center}
.gd-card{width:100%;max-width:480px;background:#12141d;border:1px solid #232838;border-radius:16px;padding:26px}
.gd-form h2,.gd-confirm h2{font-size:19px;margin:0 0 6px}
.gd-sub{font-size:13px;color:#8891a8;margin:0 0 20px;line-height:1.5}
.gd-fieldset{border:none;padding:0;margin:0 0 20px;display:flex;flex-direction:column;gap:8px}
.gd-fieldset legend{font-size:13px;font-weight:600;color:#aab0c4;margin-bottom:8px;padding:0}
.gd-radio{display:flex;align-items:flex-start;gap:10px;background:#191c28;border:1px solid #262c3f;border-radius:10px;padding:12px;cursor:pointer;transition:border-color .15s ease}
.gd-radio:has(input:checked){border-color:#6f8dff;background:#171b2c}
.gd-radio input{margin-top:3px;width:16px;height:16px;accent-color:#6f8dff;flex-shrink:0}
.gd-radio strong{display:block;font-size:13.5px;color:#e7eaf3}
.gd-radio small{display:block;font-size:12px;color:#828aa0;margin-top:2px;line-height:1.4}
.gd-field{margin-bottom:20px}
.gd-field label{display:block;font-size:13px;font-weight:600;color:#aab0c4;margin-bottom:8px}
.gd-field input[type=email]{width:100%;background:#191c28;border:1px solid #262c3f;color:#e7eaf3;padding:11px 12px;border-radius:10px;font-size:14px}
.gd-field input[type=email]:focus{outline:2px solid #6f8dff;outline-offset:1px}
.gd-error{color:#ff8a94;font-size:12px;margin:8px 0 0}
.gd-submit,.gd-restart{width:100%;background:#6f8dff;color:#0b0e1a;border:none;padding:13px;border-radius:10px;font-size:14px;font-weight:700;cursor:pointer}
.gd-submit:hover,.gd-restart:hover{background:#89a2ff}
.gd-confirm{text-align:center}
.gd-check{width:52px;height:52px;border-radius:50%;background:#173523;color:#5fe0a0;font-size:26px;display:flex;align-items:center;justify-content:center;margin:0 auto 14px}
.gd-confirm-detail{font-size:13.5px;color:#c4cadd;margin:0 0 18px}
.gd-timeline-note{background:#191c28;border:1px solid #262c3f;border-radius:10px;padding:14px 16px;text-align:left;margin-bottom:22px}
.gd-timeline-note strong{display:block;font-size:12.5px;color:#e7eaf3;margin-bottom:6px}
.gd-timeline-note p{font-size:12.5px;color:#9aa1b8;line-height:1.6;margin:0}const form = document.getElementById('gdForm');
const confirmView = document.getElementById('gdConfirm');
const confirmDetail = document.getElementById('gdConfirmDetail');
const emailInput = document.getElementById('gdEmail');
const errorEl = document.getElementById('gdError');
const restartBtn = document.getElementById('gdRestart');
function isValidEmail(value) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
}
form.addEventListener('submit', (e) => {
e.preventDefault();
if (!isValidEmail(emailInput.value.trim())) {
errorEl.hidden = false;
emailInput.focus();
return;
}
errorEl.hidden = true;
const requestType = form.querySelector('input[name="gdType"]:checked').value;
confirmDetail.innerHTML = `Your <strong>"${requestType}"</strong> request for <strong>${emailInput.value.trim()}</strong> has been logged.`;
form.hidden = true;
confirmView.hidden = false;
});
restartBtn.addEventListener('click', () => {
form.reset();
errorEl.hidden = true;
confirmView.hidden = true;
form.hidden = false;
});Extend with AI
Take This Snippet Further With AI
The AI prompt for this one is for Patreon supporters ($3 a month), along with a site with no ads. Supporters enter the passcode once and it is remembered in this browser.
What's included
Features
About this UI Snippet
GDPR Data Request Form — Access, Delete, Correct, or Export Your Data

The GDPR data request form is the interface a privacy or account-settings page provides for a person to exercise their data subject rights under GDPR — access, erasure, rectification, and portability — without emailing support and hoping someone reads it. This snippet builds a self-contained version in plain HTML, CSS, and JavaScript.
Four request types, one radio group
A fieldset/legend-grouped set of radio buttons covers the four common request types: Access, Delete, Correct, and Export my data. Each option carries a short description of what it means in plain language, not just legal shorthand, so the visitor picks the right one with confidence.
Identity confirmation before anything happens
An email field asks the requester to confirm the address tied to their account. This snippet validates it's a plausible email format client-side and blocks submission with an inline error otherwise — a real (if basic) organization needs a stronger identity check before actually acting on a request, but the form demonstrates where that gate belongs in the flow.
The correct GDPR timeline — no invented numbers
The confirmation view states the response window as *"within one month (30 days)... may be extended by up to two further months for complex requests."* This is deliberately GDPR's actual statutory deadline (Article 12(3)) — a one-month base period, extendable by two further months when the request is complex — and the copy is written to match that exactly rather than a plausible-sounding but wrong number like "5 business days" or "90 days."
A confirmation that restates the request
Once submitted, the confirmation view echoes back the selected request type and the confirmed email in a sentence, so the requester has a receipt of exactly what they asked for — useful evidence if they need to follow up.
Restart without reload
A "Submit another request" button resets the form and swaps the views back, letting one page handle multiple sequential requests (e.g., an internal tool processing several people's requests) without reloading.
Customizing it
Wire the submit handler to your real request-intake API or ticketing system, add a free-text details field for correction requests, or add a stronger identity-verification step (e.g. a follow-up email link) before the request is actually logged. Pair it with gdpr-consent-manager or cookie preferences.
Step by step
How to Use
- 1Paste HTML, CSS, and JSThe request form renders with Access preselected.
- 2Choose a request typeAccess, Delete, Correct, or Export.
- 3Confirm your emailRequired and format-validated before submit.
- 4Submit the requestErrors show inline if the email is invalid.
- 5View the confirmationSee the restated request and the GDPR timeline.
- 6Wire to a real backendReplace the demo submit with your intake API.
Real-world uses
Common Use Cases
Got questions?
Frequently Asked Questions
Because that's GDPR's actual statutory deadline. Article 12(3) requires organizations to respond to data subject requests without undue delay and within one month (roughly 30 days) of receipt, extendable by up to two further months for complex or numerous requests. This snippet states that real figure deliberately rather than an invented, faster-sounding number.
No — it performs basic email format validation only, which is not sufficient identity verification for a production privacy tool. A real implementation needs a stronger check (e.g. requiring the requester to click a confirmation link sent to the account email, or matching against authenticated session data) before actually acting on the request.
They map to core GDPR data subject rights: the right of access (Article 15), the right to erasure/"to be forgotten" (Article 17), the right to rectification (Article 16), and the right to data portability (Article 20). The form's copy summarizes each in plain language rather than citing article numbers to the end user.
In the submit handler, after validation passes, send the selected request type and confirmed email to your backend (ticketing system, CRM, or dedicated privacy-request tool) instead of just rendering the confirmation view locally, and use the real ticket/reference number in the confirmation copy.
Yes — add another radio option following the same pattern (a value, a bold label, and a description), or add fields like a free-text "what would you like corrected" box that only appears when the Correct option is selected, toggled via a change listener on the radio group.