2026-04-18·11 min read·

GDPR Art.31 Cooperation with Supervisory Authorities: What Happens When the DPA Knocks (2026)

Post #446 in the sota.io EU Cyber Compliance Series

GDPR Art.31 is deceptively short — one sentence — but it carries significant operational weight: "The controller and the processor and, where applicable, their representatives shall cooperate, on request, with the supervisory authority in the performance of its tasks."

Failure to cooperate is a standalone GDPR violation under Art.83(4)(a), punishable by fines up to €10 million or 2% of global annual turnover, separate from any underlying data protection breach that triggered the investigation. Organisations that obstruct, delay, or provide incomplete responses to SA requests often face higher fines than the underlying violation would have attracted alone. For engineers, Art.31 means: when a DPA investigates your system, you need structured processes to respond — fast, completely, and accurately.


GDPR Chapter IV Context: Art.31 in the Accountability Chain

ArticleObligationWho
Art.24Demonstrate complianceController
Art.28Processor contracts + audit rightsController + Processor
Art.30Records of Processing (RoPA)Controller + Processor
Art.32Security of Processing documentationController + Processor
Art.31Cooperate with SA on requestController + Processor
Art.57-58SA tasks and investigative powersSupervisory Authority
Art.83(4)(a)Non-cooperation fines——

Art.31 is the bridge between accountability obligations (Art.24-39) and supervisory enforcement (Art.57-58). The SA uses Art.58(1) investigative powers to request documentation, access premises, and obtain information — Art.31 is the corresponding obligation on the controller/processor to actually provide it.


Why Art.31 Applies to Processors Independently

Most GDPR articles address controllers. Art.31 is explicit that processors also bear a direct obligation to cooperate with supervisory authorities. This has important practical implications:

The processor cannot hide behind the controller. If the SA contacts your infrastructure provider, SaaS platform, or sub-processor directly, they must cooperate regardless of what the controller instructs. A processor clause in a DPA (Art.28 contract) that attempts to restrict cooperation with SAs is void.

The SA can investigate the processor directly. Under Art.58(1)(b), the SA can "carry out investigations in the form of data protection audits" of processors. Under Art.58(1)(e), the SA can "obtain, from the controller and the processor, access to all personal data and to all information necessary for the performance of its tasks."

sota.io as a PaaS processor: When sota.io processes personal data on behalf of its customers (the controllers), any SA investigation of a customer's processing can extend to sota.io. The Art.28 Data Processing Agreement includes audit rights — Art.31 ensures those aren't merely contractual paper rights.


What SA Investigations Look Like in Practice

Types of SA Investigations

1. Complaint-Based Investigation (Art.77 + Art.57(1)(f))

Triggered when a data subject files a complaint with their national SA. The SA must investigate and inform the complainant of progress within 3 months (Art.77(2)). Investigation steps typically include:

2. Ex-Officio Investigation (Art.57(1)(a))

Initiated by the SA itself based on media reports, whistleblowers, sector risk assessments, or AI Act coordination. Common triggers: data breaches reported late, cookie consent violations detected by automated scanning, large-scale profiling without adequate legal basis.

3. Post-Breach Follow-Up (Art.33(1) + Art.58(1))

After a data breach notification under Art.33, the SA routinely follows up to verify: whether the breach notification was timely (72-hour clock), whether the breach was properly contained, and whether the controller has implemented corrective measures. Expect document requests within 30-60 days of breach notification.

4. Coordinated Enforcement Action

EDPB coordinates cross-border actions annually. Recent examples: cookie consent sweep (2023), right of access implementation (2023-2024), dark patterns on social media (2022-2023). If your sector is targeted, expect unsolicited information requests.


Art.58(1) Powers: What the SA Can Actually Demand

The SA's investigative tools under Art.58(1) define what "cooperation" means in practice:

SA PowerWhat It Means for Engineers
Art.58(1)(a)Request any information from controller/processor
Art.58(1)(b)Carry out data protection audits
Art.58(1)(c)Notify of alleged violations
Art.58(1)(d)Request RoPA
Art.58(1)(e)Access all personal data and processing information
Art.58(1)(f)Access premises (including data processing equipment)

The "all information" standard under Art.58(1)(e) is broad. SA investigators have successfully demanded: API logs, access control policies, system architecture diagrams, vendor contracts, encryption key management procedures, and source code for high-risk processing systems.


Response Timelines and Practical Obligations

No Statutory Response Deadline in Art.31

Art.31 does not specify a response deadline — cooperation is simply "on request." In practice:

Failure to respond within the SA's deadline = non-cooperation, even if you eventually produce the information.

What "Cooperation" Requires

Cooperation under Art.31 requires:

  1. Timely response — within the SA-specified deadline
  2. Complete response — not selectively producing documents
  3. Accurate response — incorrect information to an SA is an aggravating factor
  4. Accessible format — documents must be intelligible, not deliberately obscure
  5. Point of contact — designated person who handles SA communications

EDPB Guidelines on SA cooperation (incorporated into national guidance) consistently treat deliberate delay, redaction beyond legal privilege, and incomplete responses as non-cooperation. Non-cooperation in the course of an investigation triggers Art.83(4)(a) independently.


What to Have Ready When the SA Contacts You

Based on the most common SA requests across GDPR investigations in the EU:

Documentation Tier 1 (Always Ready)

These should be maintained continuously and producible within 48 hours:

docs/gdpr/
├── ropa.json              # Article 30 Records of Processing
├── legal-basis/
│   ├── basis-mapping.md   # Each processing activity → Art.6/9 legal basis
│   └── legitimate-interests-balancing.md
├── dpa-contracts/         # Article 28 processor contracts
├── privacy-notices/       # Article 13/14 information provided to data subjects
└── dpo-contact.md         # DPO designation + contact details (if applicable)

Documentation Tier 2 (Incident-Triggered, 1-Week Preparation)

docs/gdpr/incidents/
├── breach-notifications/  # Article 33 notifications filed with SA
├── dpia-register/         # Article 35 DPIAs with risk conclusions
├── prior-consultations/   # Article 36 consultations submitted
└── subject-requests/      # DSARs received, responded to, refused

Documentation Tier 3 (Deep Technical, 2-4 Week Preparation)

docs/gdpr/technical/
├── system-architecture.md # Data flows, processing locations, third-party integrations
├── access-controls.md     # Who has access to what personal data
├── encryption-standards.md# Encryption at rest/in transit, key management
├── retention-schedules.md # How long data is kept, automated deletion
└── vendor-assessments/    # Sub-processor TOMs evaluations

Art.83(4)(a): The Non-Cooperation Fine

Non-cooperation with SA investigations falls under Art.83(4)(a) — the lower fine tier but not trivially small:

Fine TierMaximumApplies To
Art.83(4)€10M or 2% global turnoverNon-cooperation (Art.31), processor violations, certification failures
Art.83(5)€20M or 4% global turnoverLegal basis violations, data subject rights, international transfers

Critically, Art.83(4)(a) fines are cumulative with any Art.83(5) fines for underlying violations. Organisations that obstruct investigations regularly receive dual fines:

CNIL vs. Clearview AI (2022, €20M): Clearview failed to respond to CNIL access requests (non-cooperation) and violated data subject rights (separate Art.83(5) basis). The non-cooperation elevated the overall penalty.

ICO vs. TikTok (2023, £12.7M): ICO's investigation was complicated by incomplete responses and document production delays — classified as partial non-cooperation, treated as aggravating factor.

AEPD vs. Vodafone Spain (2021, €8.15M): Multiple Art.83(4) violations including obstruction of SA investigation, combined with underlying data protection violations.

UODO vs. Company (Poland, 2021, ~€45k SME): Small company failed to respond to UODO information request within deadline. Fine issued purely for non-cooperation, even though underlying processing turned out to be compliant.


Python SACooperationTracker

from dataclasses import dataclass, field
from datetime import date, timedelta
from enum import Enum
from typing import Optional

class InvestigationType(Enum):
    COMPLAINT_BASED = "complaint_based"
    EX_OFFICIO = "ex_officio"
    POST_BREACH = "post_breach"
    COORDINATED_ENFORCEMENT = "coordinated_enforcement"
    AUDIT = "audit"

class CooperationStatus(Enum):
    RECEIVED = "received"           # SA contact received
    ACKNOWLEDGED = "acknowledged"   # Formal acknowledgement sent
    IN_PREPARATION = "in_preparation"  # Gathering documents
    RESPONSE_SENT = "response_sent" # Response submitted
    FOLLOW_UP_PENDING = "follow_up_pending"  # SA requested more
    CLOSED = "closed"               # Investigation concluded

@dataclass
class SARequest:
    reference_number: str
    supervisory_authority: str      # e.g., "BfDI", "CNIL", "ICO", "AEPD"
    received_date: date
    investigation_type: InvestigationType
    deadline: date                  # SA-specified response deadline
    description: str
    contact_person: str             # Internal point of contact
    status: CooperationStatus = CooperationStatus.RECEIVED
    articles_cited: list[str] = field(default_factory=list)
    documents_requested: list[str] = field(default_factory=list)
    response_sent_date: Optional[date] = None
    notes: str = ""

    @property
    def days_until_deadline(self) -> int:
        return (self.deadline - date.today()).days

    @property
    def is_overdue(self) -> bool:
        return date.today() > self.deadline and self.status not in [
            CooperationStatus.RESPONSE_SENT,
            CooperationStatus.CLOSED
        ]

    @property
    def requires_urgent_action(self) -> bool:
        return self.days_until_deadline <= 5 and self.status not in [
            CooperationStatus.RESPONSE_SENT,
            CooperationStatus.CLOSED
        ]

class SACooperationTracker:
    def __init__(self):
        self.requests: list[SARequest] = []

    def register_request(self, request: SARequest) -> None:
        self.requests.append(request)
        print(f"[REGISTERED] SA request {request.reference_number} "
              f"from {request.supervisory_authority} "
              f"— deadline: {request.deadline} "
              f"({request.days_until_deadline} days)")

    def get_overdue(self) -> list[SARequest]:
        return [r for r in self.requests if r.is_overdue]

    def get_urgent(self) -> list[SARequest]:
        return [r for r in self.requests if r.requires_urgent_action]

    def dashboard(self) -> None:
        open_requests = [r for r in self.requests
                         if r.status != CooperationStatus.CLOSED]
        print(f"\n=== SA Cooperation Dashboard ===")
        print(f"Open requests: {len(open_requests)}")
        print(f"Overdue: {len(self.get_overdue())}")
        print(f"Urgent (<5 days): {len(self.get_urgent())}")
        for r in open_requests:
            status_flag = "🔴 OVERDUE" if r.is_overdue else (
                "🟡 URGENT" if r.requires_urgent_action else "🟢 OK"
            )
            print(f"  {status_flag} [{r.reference_number}] {r.supervisory_authority} "
                  f"— {r.investigation_type.value} — deadline {r.deadline}")

# Example usage
tracker = SACooperationTracker()

tracker.register_request(SARequest(
    reference_number="BfDI-2026-0142",
    supervisory_authority="BfDI",
    received_date=date(2026, 4, 15),
    investigation_type=InvestigationType.COMPLAINT_BASED,
    deadline=date(2026, 5, 13),
    description="Data subject complaint re: right of access response time",
    contact_person="dpo@example.com",
    articles_cited=["Art.15", "Art.31", "Art.57"],
    documents_requested=["DSAR log", "Privacy notice", "Processing records for complainant"],
))

tracker.dashboard()

Processor Obligations in SA Cooperation

When the SA investigates a controller and requests information about processor activities, the information chain typically flows: SA → Controller → Processor. But Art.31 creates direct SA-Processor obligations too:

When the SA Contacts the Processor Directly

Under Art.58(1), the SA can contact processors directly. A processor should:

  1. Immediately notify the controller that SA contact has been made
  2. Not provide information without controller involvement unless legally required
  3. Respond to legally mandated requests — cannot refuse on grounds of controller instructions
  4. Preserve all relevant data — obstruction risk if data is deleted after SA contact

Processor Non-Cooperation Risks

Processors face their own Art.83(4)(a) exposure. Cloud providers, SaaS companies, and managed service providers have received SA information requests independent of their controller customers. If you operate as a processor (including PaaS):

# Processor cooperation checklist
processor_cooperation_requirements = {
    "ropa_processor_section": "Art.30(2) records maintained for all controller customers",
    "dpa_contracts": "Art.28 contracts with all controllers — SA may request copies",
    "sub_processor_chain": "List of sub-processors + their Art.28 contracts available",
    "tom_documentation": "Technical and organisational measures documented per customer",
    "data_location": "Where each customer's data is stored (country/region)",
    "breach_procedures": "Art.33(2) notification to controller within 72h of becoming aware",
    "sa_contact_protocol": "Internal procedure for handling SA contacts",
}

Art.31 and the One-Stop-Shop (Art.60-76)

For controllers with cross-border processing, Art.31 cooperation operates through the one-stop-shop mechanism:

Practical implication: If you have users in Germany, France, and the Netherlands, and your main establishment is in Ireland, the Irish DPC leads the investigation. You cooperate with the DPC, but the CNIL, BfDI, and AP can submit observations and may receive copies of your responses.


Developer Checklist: Art.31 Compliance

Art.31 Operational Readiness

DOCUMENTATION AVAILABILITY
[ ] RoPA (Art.30) exportable within 48 hours
[ ] Legal basis mapping for all processing activities
[ ] Art.28 DPA contracts with all processors
[ ] Privacy notices (Art.13/14) for all processing contexts
[ ] DPO contact details (if DPO designated)
[ ] DPIA register (if Art.35 assessments conducted)

INTERNAL PROCESS
[ ] Designated Art.31 contact person (not just DPO — operational lead)
[ ] SA communication protocol: who responds, who reviews, who signs off
[ ] Legal review requirement for SA responses defined
[ ] Escalation path if SA requests access to source code or systems
[ ] Preservation protocol: legal hold when SA investigation begins

PROCESSOR READINESS
[ ] Notification obligation to controller if SA contacts processor directly
[ ] Sub-processor chain documented and contractually covered
[ ] Data location records per controller customer
[ ] Breach-to-controller notification workflow tested

TIMELINE MANAGEMENT
[ ] SA deadline tracking system (see SACooperationTracker above)
[ ] Response preparation workflow with 1-week buffer before SA deadline
[ ] Version control for all documents produced to SAs
[ ] Response audit trail (what was sent, when, to whom)

See Also