Skip to content

Request forms · 4 fields

GDPR data subject request form template

One clear place for people to ask for a copy of their data, a correction, deletion or a stop to processing. The GDPR does not require a form, but a form makes requests complete and easy to track against the one-month deadline.

Get the code

GDPR data subject request

Live demo: try the fields. Submitting sends nothing.

We reply to this address and use it to find your data.

Which data or which part of our service this is about, if you know.

Why these fields

  • Full name

    text · required

    Required. Together with the email address it lets you find the person's records.

  • Email you use with us

    email · required

    Required. Ask for the address they use with you, so you search the right records and reply to the right person.

  • What would you like us to do?

    select · required

    Required. The options follow the rights in Articles 15 to 21 GDPR (access, rectification, erasure, restriction, portability, objection) and the withdrawal of consent in Article 7(3).

  • Details

    textarea · optional

    Optional. It helps you find the data faster, but a request is valid without it.

When to use it

Link it from your privacy notice, next to the email address you already give for privacy questions. People may make a request in any way they like, by email or letter too, so the form is an extra route and never the only one.

Use one form for every right. The request type tells you which right is being used, and the details box tells you where to look.

Privacy and GDPR

  • Ask only for what you need to find the person. Do not ask everyone for a copy of an ID document: request extra proof only when you have reasonable doubts about who is asking (Article 12(6)).
  • Answer without undue delay and at the latest within one month of receiving the request. For complex or numerous requests you may extend by two further months, if you tell the person within the first month (Article 12(3)).
  • Keep the request and your answer as a record of how you handled it, and delete both when that record is no longer needed.

Choose your stack. Copy your form.

Replace the example endpoint with your Formward endpoint, then adapt the fields to your needs.

<form action="https://forms.formward.eu/f/your-form-id" method="POST">
  <label for="name">Full name</label>
  <input type="text" name="name" id="name" required />
  <label for="email">Email you use with us</label>
  <small id="email-help">We reply to this address and use it to find your data.</small>
  <input type="email" name="email" id="email" aria-describedby="email-help" required />
  <label for="request_type">What would you like us to do?</label>
  <select name="request_type" id="request_type" required>
    <option value="Give me a copy of my data">Give me a copy of my data</option>
    <option value="Correct my data">Correct my data</option>
    <option value="Delete my data">Delete my data</option>
    <option value="Send my data to me in a reusable format">Send my data to me in a reusable format</option>
    <option value="Stop or limit how you use my data">Stop or limit how you use my data</option>
    <option value="Withdraw my consent">Withdraw my consent</option>
  </select>
  <label for="details">Details</label>
  <small id="details-help">Which data or which part of our service this is about, if you know.</small>
  <textarea name="details" id="details" aria-describedby="details-help"></textarea>
  <input type="text" name="_gotcha" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true" />
  <button type="submit">Send</button>
</form>

Accessible by default, and how to keep it that way

  • Every field in the code has a visible label tied to it with for and id, so screen readers announce what to enter and a click on the label focuses the field.
  • Required fields carry the required attribute, so the browser explains a missing answer before anything is sent. Say “required” in words as well; an asterisk or a colour alone is easy to miss.
  • The spam trap field (_gotcha) is hidden from screen readers with aria-hidden and skipped by the Tab key, so people never meet it.
  • In the JavaScript versions, show the confirmation or error in an element with role="status" so the result is announced, and keep the entered answers when sending fails.

Changed the fields? Paste your version into the HTML form tester to see exactly what it sends, or run it through the GDPR form checker.

How the code talks to Formward

Each form you create gets its own endpoint in the form https://forms.formward.eu/f/your-form-id. The HTML version posts to it directly and the browser is redirected to a thank-you page, so it works without JavaScript.

The Next.js version below sends the same fields with fetch and an Accept: application/json header. Formward then answers with { ok: true, id }, or an error body with 402 when the plan limit is reached and 429 when the rate limit kicks in. See responses and status codes.

Next.js client component

"use client";

import { useState } from "react";

export function DataSubjectRequestForm() {
  const [sent, setSent] = useState(false);

  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();
    const form = e.currentTarget;
    const res = await fetch("https://forms.formward.eu/f/your-form-id", {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(form),
    });
    if (res.ok) {
      setSent(true);
      form.reset();
    }
  }

  if (sent) return <p>Thanks! Your message has been sent.</p>;

  return (
    <form onSubmit={onSubmit}>
      <label htmlFor="name">Full name</label>
      <input type="text" name="name" id="name" required />
      <label htmlFor="email">Email you use with us</label>
      <small id="email-help">We reply to this address and use it to find your data.</small>
      <input type="email" name="email" id="email" aria-describedby="email-help" required />
      <label htmlFor="request_type">What would you like us to do?</label>
      <select name="request_type" id="request_type" required>
        <option value="Give me a copy of my data">Give me a copy of my data</option>
        <option value="Correct my data">Correct my data</option>
        <option value="Delete my data">Delete my data</option>
        <option value="Send my data to me in a reusable format">Send my data to me in a reusable format</option>
        <option value="Stop or limit how you use my data">Stop or limit how you use my data</option>
        <option value="Withdraw my consent">Withdraw my consent</option>
      </select>
      <label htmlFor="details">Details</label>
      <small id="details-help">Which data or which part of our service this is about, if you know.</small>
      <textarea name="details" id="details" aria-describedby="details-help" />
      <input
        type="text"
        name="_gotcha"
        tabIndex={-1}
        autoComplete="off"
        style={{ position: "absolute", left: "-9999px" }}
        aria-hidden="true"
      />
      <button type="submit">Send</button>
    </form>
  );
}

Spam protection

  • The generated code already includes the hidden _gotcha honeypot. Leave it in: a bot that fills it gets a normal success response, the submission is filed as spam and no email is sent.
  • Every form has a per-IP rate limit, and you can restrict it to your own domains with the allowed-origins list in the form settings.
  • Cloudflare Turnstile is optional and works on every plan, including Free. Turn it on in the form settings, add the widget to your markup and Formward checks the token server-side.
  • The form settings can also reject disposable email addresses, which is worth turning on when a fake address would waste your time.

What happens after submit

  • Each request is emailed to you and stored in the EU on every plan, with the time it arrived: that is when the one-month clock starts.
  • From Professional, the autoresponder can confirm receipt straight away and say when the person can expect an answer.
  • Answer from your own mailbox, and note the date you replied next to the request.

Questions

Do I need a form for GDPR requests?
No. A request made by email, by letter or in any other way is just as valid. A form helps people include what you need and helps you track the deadline, so offer it next to your privacy email address, not instead of it.
Can I ask for ID before answering?
Only when you have reasonable doubts about who is asking. Matching the request to the email address you already hold is often enough, and asking everyone for a passport copy collects more data than the request needs.

Customize before publishing

  • Remove fields you do not need and mark only essential answers as required.
  • Replace placeholder wording with terms your audience already understands.
  • Add your privacy notice, retention details and expected response time.
  • Test keyboard focus, validation errors and the confirmation state on mobile.

Use this template

Create a free account and the form is set up from this template. Copy your endpoint and replace https://forms.formward.eu/f/your-form-id in the code above.

Use this template →