Privacy operations teams and Data Protection Officers (DPOs) routinely receive data subject access requests (DSARs) and deletion requests through a variety of channels—email, web forms, support tickets, and even physical mail. These requests arrive as unstructured free text with wildly inconsistent formatting. A single inbox might contain a one-line demand for 'all my data,' a legally worded letter citing specific statutes, and a customer support ticket asking to 'close my account and remove my info.' Manually triaging this queue creates operational bottlenecks, risks missing statutory response deadlines (e.g., GDPR's 30-day window), and introduces classification errors that can lead to non-compliance. This prompt is designed to be the first step in an automated pipeline, extracting structured, machine-readable details from raw DSAR text so that requests can be instantly routed, prioritized, and logged.
Prompt
GDPR Data Subject Request Extraction Prompt

When to Use This Prompt
Convert unstructured data subject access and deletion requests into structured, auditable payloads for privacy operations teams.
The ideal user is a privacy engineer or operations lead integrating this prompt into a request intake system. The prompt expects a raw text input and a defined output schema, and it returns a typed JSON payload containing the request category (e.g., access, deletion, rectification), the data subject's identity details, verification status, the scope of the request, and a calculated statutory deadline. It is built for a high-stakes domain, so it includes explicit instructions for handling ambiguity—such as flagging when identity is unverified or when the scope of data requested is vague—rather than guessing. Do not use this prompt for automated legal decisions, for performing the actual identity verification, or for generating a final response to the data subject. Its job is solely to structure the intake.
Before using this prompt, ensure you have a clear understanding of the input channels you will be processing and the downstream system that will consume the structured JSON. The prompt is most effective when paired with a validation layer that checks the output against your expected schema and a human review queue for requests flagged as high-risk or ambiguous. The next section provides the copy-ready prompt template you can adapt to your specific jurisdictional requirements and data taxonomy.
Use Case Fit
Where the GDPR Data Subject Request Extraction Prompt works well, where it fails, and the operational preconditions required before deployment.
Good Fit: Structured Intake Forms
Use when: Users submit DSARs through web forms with clear fields. The prompt excels at normalizing structured input into typed categories (access, deletion, rectification) and extracting identity verification markers. Guardrail: Always validate the extracted identity against your customer database before processing the request scope.
Bad Fit: Unstructured Legal Threats
Avoid when: The inbound email is a multi-page legal letter mixing a DSAR with litigation threats, settlement offers, or regulatory complaints. The prompt may extract the DSAR but miss the legal risk context. Guardrail: Route documents exceeding a complexity threshold to human legal review before AI extraction.
Required Input: Verified Sender Context
Risk: Extracting a request without verifying the sender's identity or jurisdiction leads to unauthorized data disclosure. Guardrail: The prompt must receive a pre-verified [SENDER_IDENTITY_STATUS] and [JURISDICTION] variable from your identity provider. Never rely on the model to verify identity from the email body alone.
Operational Risk: Ambiguous Data Scope
Risk: A request for 'all my data' without specifying systems (CRM, logs, HR) creates an unbounded scope that can break downstream fulfillment. Guardrail: The prompt must output a data_scope_confidence score. If confidence is low, route to a human for scope clarification before triggering automated data collection.
Operational Risk: Multi-Jurisdiction Conflicts
Risk: A single request invoking both GDPR and CCPA rights can create conflicting deadlines and redaction rules. Guardrail: The prompt must extract each distinct jurisdictional basis separately. Use a post-processing rule to flag conflicting obligations and escalate to the DPO for resolution.
Bad Fit: Voice or Scanned Handwriting
Avoid when: The request arrives as an audio file or a low-quality scan of a handwritten letter. Transcription errors or OCR artifacts will corrupt entity extraction and deadline calculations. Guardrail: Require a human-verified transcript or high-quality OCR text as the [INPUT] before invoking this prompt.
Copy-Ready Prompt Template
A production-ready prompt for extracting structured GDPR data subject request details from unstructured text, with strict JSON output, null handling, and confidence annotation.
The following prompt template is designed to be copied directly into your AI harness. It instructs the model to act as a privacy operations extraction engine, consuming raw request text and producing a typed JSON payload. The template uses square-bracket placeholders for all dynamic inputs, including the request text, the required output schema, and any operational constraints. Before integrating, replace each placeholder with the actual values your application provides at runtime. This prompt enforces strict behavior: no fabricated data, explicit nulls for missing fields, and confidence scores where evidence is ambiguous. It is the core instruction set you will wrap with validation, retries, and logging in your implementation harness.
textYou are a GDPR Data Subject Request extraction engine. Your only job is to read the provided request text and return a valid JSON object that matches the [OUTPUT_SCHEMA]. Follow these rules exactly: - Extract only information explicitly stated in the request text. Do not infer, assume, or fabricate any data. - For any field where the information is not present or cannot be determined, use null. - For any field where the evidence is ambiguous or partial, include a "confidence" field with a value of "low", "medium", or "high". - Normalize dates to ISO 8601 format (YYYY-MM-DD). - Normalize request types to the controlled vocabulary in [REQUEST_TYPE_ENUM]. - If the request mentions multiple jurisdictions, extract each as a separate entry in the "jurisdictions" array. - Calculate the regulatory deadline from the date of receipt using the rules in [DEADLINE_RULES]. If the receipt date is missing, set the deadline to null. - Do not include any text outside the JSON object. [INPUT] [OUTPUT_SCHEMA] [REQUEST_TYPE_ENUM] [DEADLINE_RULES] [CONSTRAINTS]
To adapt this template, start by defining your [OUTPUT_SCHEMA] as a strict JSON Schema object. This schema should include fields for request_type, data_subject_identity, identity_verification_status, data_scope, jurisdictions, receipt_date, and regulatory_deadline. The [REQUEST_TYPE_ENUM] placeholder should be replaced with a comma-separated list of your supported request types, such as access, deletion, rectification, portability, restriction, and objection. The [DEADLINE_RULES] placeholder must contain clear, jurisdiction-specific rules for calculating the response deadline (e.g., "GDPR: one calendar month from receipt, extendable by two months for complex requests"). The [CONSTRAINTS] placeholder is your final safety net; use it to inject operational rules like "If identity_verification_status is unverified, set data_scope to null and add a note to the response." After replacing the placeholders, test the prompt against a golden dataset of known requests and edge cases, including blank inputs, ambiguous scopes, and multi-language text. The next step is to wire this prompt into an application harness that validates the JSON output against your schema before any downstream action is taken.
Prompt Variables
Inputs required for the GDPR Data Subject Request Extraction Prompt to produce reliable, typed outputs. Replace each placeholder with concrete values before execution.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[REQUEST_TEXT] | The raw text of the data subject request, which may include email bodies, web form submissions, or transcribed verbal requests. | I want to know what personal data you hold on me. Please delete my email address and phone number from your marketing lists. | Must be a non-empty string. Check for encoding issues if copied from web forms or email clients. Null not allowed. |
[JURISDICTION] | The legal jurisdiction under which the request is being evaluated, which determines the applicable rights and deadline calculations. | GDPR-EU | Must match an allowed enum value: GDPR-EU, GDPR-UK, or MULTI. If MULTI, the prompt should flag for manual review. Validate against a controlled list before injection. |
[REQUEST_DATE] | The date the request was received, used for calculating the statutory response deadline. | 2025-03-15 | Must be in ISO 8601 date format (YYYY-MM-DD). Parse and validate as a real calendar date. Future dates should trigger a warning. |
[COMPANY_NAME] | The legal name of the data controller organization, used to contextualize identity verification checks. | Acme Corp EU Subsidiary GmbH | Must be a non-empty string. Should match the registered legal entity name. Null not allowed. |
[DPO_EMAIL] | The contact email for the Data Protection Officer, included in the output for downstream acknowledgment workflows. | Must match a basic email regex pattern. Validate format before injection. Null not allowed. | |
[OUTPUT_SCHEMA] | The strict JSON schema definition that the model must conform to, including required fields, types, and enum constraints. | See full JSON Schema in Output Contract section | Must be a valid JSON Schema object. Validate with a schema validator before injection. The schema should define request_category, identity_verification_status, data_scope, and deadline_calculation fields. |
[CONSTRAINTS] | Additional behavioral constraints injected into the prompt, such as handling rules for ambiguous scope or multi-jurisdiction requests. | If request_category is ambiguous, set confidence to LOW and flag for human review. Do not infer data categories not explicitly mentioned. | Must be a non-empty string. Review constraints for conflicts with the output schema. Null allowed if no special constraints are needed. |
Implementation Harness Notes
Wire this prompt into a DSAR intake pipeline with validation, retry, and human escalation.
The extraction prompt is only one component of a reliable DSAR processing system. To move from a useful prompt to a production-grade intake pipeline, you must wrap the LLM call in application logic that validates the output, handles failures gracefully, and maintains a complete audit trail. This harness is responsible for substituting variables into the template, calling the model, checking the response against the expected schema, and deciding whether the extracted payload is trustworthy enough to ingest into your case management system. Without this layer, even a well-designed prompt will produce occasional malformed JSON, low-confidence classifications, or ambiguous identity verification signals that should never flow into automated workflows.
Begin by constructing the final prompt string from the template, substituting [REQUEST_TEXT] with the raw, unredacted data subject request and [RECEIPT_DATE] with the ISO 8601 timestamp of receipt. Call the LLM with a low temperature (0.0–0.1) to maximize schema adherence. Parse the response and validate the JSON against the output schema: request_type must be one of the defined enum values, identity_verification_status must be a recognized status, and all required fields must be present. If validation fails, construct a retry prompt that appends the original request text, the failed JSON output, and the specific validation errors, then call the model once more. If the retry also fails, log the failure and route the entire request to a human review queue. Do not attempt more than one automated retry for schema validation failures.
Confidence scoring is the primary gating mechanism for automation. After successful schema validation, check the confidence_scores: if request_type_confidence or identity_verification_confidence falls below 0.7, route the request to the human review queue regardless of schema validity. For requests that pass both schema and confidence gates, calculate the statutory deadline by adding one calendar month to receipt_date, adjusting for your organization's jurisdiction rules (e.g., accounting for local holidays or specific regulatory interpretations of 'one month'). Store the complete structured payload in your DSAR case management system, trigger the appropriate workflow based on request_type (access, deletion, rectification, portability, objection, or restriction), and log every extraction with the SHA-256 hash of the raw request text, the full extracted payload, all confidence scores, the reviewer decision if escalated, and the calculated deadline. Never use the extracted output to automatically respond to the data subject without DPO review, even when all confidence scores are high.
Expected Output Contract
The structured JSON payload the prompt must return for a GDPR Data Subject Request. Use this contract to build a downstream validator and integration adapter.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
request_id | string (UUID) | Must be a valid UUID v4 generated by the extraction prompt if not present in [INPUT] | |
request_type | enum: access | deletion | rectification | restriction | portability | objection | Must match exactly one of the listed enum values; reject any other string | |
subject_identity.status | enum: verified | unverified | partial | not_provided | Must be one of the four enum values; if no identity evidence is found, set to not_provided | |
subject_identity.details | object { name, email, id_reference, additional_identifiers } | All sub-fields default to null if not extractable; email must pass a basic regex check if present | |
data_scope.categories | array of strings from a controlled taxonomy | Each string must match an entry in the approved data category taxonomy; empty array allowed if scope is fully general | |
data_scope.systems | array of strings | If present, each string must be a non-empty system identifier; null allowed if no systems specified | |
data_scope.temporal_range | object { start: ISO8601 | null, end: ISO8601 | null } | If provided, dates must be valid ISO8601 strings; null for open-ended ranges; start must be before end if both present | |
deadline.calculated_date | ISO8601 date string | Must be a valid date exactly 30 calendar days from the receipt date; if receipt date is ambiguous, set to null and flag in warnings | |
jurisdictions | array of ISO 3166-1 alpha-2 country codes | Each entry must be a valid two-letter country code; at least one jurisdiction required; reject unknown codes |
Common Failure Modes
What breaks first when extracting structured data from GDPR Data Subject Requests and how to guard against it in production.
Ambiguous Scope of Request
What to watch: The model fails to distinguish between an access request, a deletion request, and a rectification request when the user's language is vague or mixes multiple request types. This leads to incorrect downstream routing and potential non-compliance. Guardrail: Use a strict enum for request_type in the output schema and instruct the model to default to clarification_needed if the primary intent cannot be determined. Add a pre-processing classification step before extraction.
Unverified Identity Assumption
What to watch: The prompt extracts detailed personal data scope or processes a request without flagging that the user's identity has not been verified. This creates a critical data breach risk. Guardrail: Include a required boolean field identity_verified in the output schema. The prompt must be instructed to set this to false unless explicit verification evidence is provided in the input context. Downstream systems should block fulfillment if this flag is not true.
Multi-Jurisdiction Deadline Miscalculation
What to watch: The model calculates a single deadline based on GDPR (30 days) but misses that the request also falls under a national law with a shorter timeline, or fails to account for valid extensions. Guardrail: Instruct the model to extract all mentioned jurisdictions and calculate a deadline for each. Add a strictest_deadline field and a deadline_calculation_notes field to show the work. Always require human review of the final deadline before it is communicated to the requestor.
Hallucinated Data Categories
What to watch: The model invents specific data categories (e.g.,
Ignoring Implicit Refusal to Narrow Scope
What to watch: The organization asks the requestor to clarify or narrow an overly broad request, and the requestor's follow-up is non-committal or repeats the broad request. The model interprets this as a valid narrowed scope. Guardrail: Include a scope_clarification_status field with values like narrowed, still_broad, or no_response. The prompt must be instructed to detect when a follow-up message does not actually provide the requested clarification and to flag the scope as unresolved for human intervention.
Conflation of Controller and Processor Requests
What to watch: A request is directed at a data processor, but the model extracts it as a standard controller request, missing the critical step of identifying the obligation to forward the request to the relevant controller. Guardrail: Add a recipient_role field to the output schema with options for controller and processor. The prompt must be instructed to identify the recipient's role and, if processor, to extract the identity of the controller and set a must_forward_to_controller flag to true.
Evaluation Rubric
Criteria for testing the GDPR Data Subject Request Extraction Prompt before production deployment. Each row defines a pass standard, a failure signal, and a concrete test method to validate output quality.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Request Type Classification | Output field [REQUEST_TYPE] is exactly one of the defined enum values: 'access', 'deletion', 'rectification', 'portability', 'restriction', 'objection'. | Missing field, null value, or value not in the enum list. | Run 50 labeled examples per request type. Assert enum membership and exact match to ground truth label. |
Identity Verification Status | Output field [IDENTITY_VERIFIED] is a boolean. When [VERIFICATION_EVIDENCE] is present, it contains a direct quote from [INPUT_TEXT]. | Boolean is null or [VERIFICATION_EVIDENCE] contains a hallucinated quote not found verbatim in the input. | Run 30 examples with explicit ID proof and 30 without. Assert boolean correctness and exact string match of evidence span. |
Data Scope Specification | Output field [DATA_CATEGORIES] is a non-empty array of strings when scope is specified. Each string maps to a category mentioned in [INPUT_TEXT]. | Array is empty when scope is specified, or contains categories not mentioned in the input. | Run 20 examples with explicit scope lists. Assert array length > 0 and that every element has a corresponding substring match in the input. |
Deadline Calculation | Output field [RESPONSE_DEADLINE] is an ISO 8601 date. It is exactly 30 calendar days from [RECEIPT_DATE] unless a jurisdiction-specific override is triggered. | Date is missing, incorrectly calculated, or uses the wrong jurisdiction rule. | Run 10 examples with known receipt dates and jurisdictions. Assert date difference equals 30 days for GDPR-default cases. |
Multi-Jurisdiction Handling | When [INPUT_TEXT] references multiple regulations, output field [APPLICABLE_REGULATIONS] is an array containing all referenced jurisdictions. [RESPONSE_DEADLINE] uses the shortest applicable deadline. | Array is missing a referenced regulation, or deadline is not the minimum of the applicable rules. | Run 10 examples mixing GDPR, CCPA, and LGPD references. Assert array completeness and that deadline equals the minimum calculated value. |
Ambiguous Scope Flagging | When the data scope is ambiguous, output field [SCOPE_AMBIGUITY_FLAG] is true and [CLARIFICATION_NEEDED] contains a non-empty string describing the ambiguity. | Flag is false when scope is ambiguous, or [CLARIFICATION_NEEDED] is empty or generic. | Run 15 examples with deliberately vague scope language. Assert flag is true and clarification string length > 20 characters. |
Source Grounding | Every extracted field value that is not a derived calculation must have a corresponding substring match in [INPUT_TEXT]. | A field contains a value not present in the input text, indicating hallucination. | Automated substring check: for each non-derived field, assert value is a substring of [INPUT_TEXT] or is null. |
Null vs. Missing Distinction | Fields with no information in the input are null. Fields where the input explicitly states the information is unavailable are set to the string 'UNAVAILABLE'. | Null and 'UNAVAILABLE' are used interchangeably, or a field is populated with a guess when evidence is absent. | Run 20 examples with known missing vs. unavailable fields. Assert exact match to expected null or 'UNAVAILABLE' token. |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Use the base prompt with a frontier model and a simple JSON schema. Focus on extracting the core fields: request_type, data_subject_identity, identity_verification_status, and data_scope. Skip deadline calculations and jurisdiction analysis. Use a single example in the prompt to guide output shape.
Watch for
- The model conflating
accessanddeletionrequests when both are mentioned. - Missing
identity_verification_statuswhen the request is ambiguous. - Overly broad
data_scopewhen the user says "everything" or "all my data."

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us