TNS-22Required EU law
Send a statement of reasons for every restriction
Send the affected user a statement of reasons for every restriction you place on their content or account. That covers removal, blocking, demotion, hidden reach, cut payments, suspension and closure.
Region
European Union (EU). The duty comes from the law there. The rule applies only when the project serves people there, and its Applies when also holds.
How to do it
Article 17 of the Digital Services Act applies to every hosting service, whatever started the decision. A quiet demotion or a hidden reply counts as much as a removal, so a shadow ban without a notice breaks the law. Send the statement when the restriction starts, to the contact details you hold. Build it from the policy table row and the decision record. Name the restriction, its scope and length, the facts, and whether a notice or your own search found it. Say whether automated means found or decided it. Give the legal or contract ground and the ways to appeal, including out-of-court bodies and the courts. Answers to notices are covered in Take notices about illegal content and answer each one.
Examples
JavaScript example
export async function restrict(decision) {
await applyRestriction(decision);
await statements.send(decision.userId, {
restriction: decision.type, scope: decision.territory, until: decision.endsAt,
facts: decision.facts, source: decision.source, automatedDetection: decision.automatedDetection,
automatedDecision: decision.automatedDecision, ground: policyRow(decision.reason).ground, redress: REDRESS_LINKS,
});
}
Python example
def restrict(decision):
apply_restriction(decision)
statements.send(decision.user_id, {
"restriction": decision.type, "scope": decision.territory, "until": decision.ends_at,
"facts": decision.facts, "source": decision.source, "automated_detection": decision.automated_detection,
"automated_decision": decision.automated_decision, "ground": policy_row(decision.reason).ground,
"redress": REDRESS_LINKS,
})
How to check
A test applies each restriction type in the policy table to a test account, including a demotion. Each creates one statement with the restriction, the ground, the automation fields and the appeal links. A search of the code for actions that lower reach finds none that skip the statement function.
Sources
Related rules
- TNS-2 Write the moderation policy as one table of reasons and actions in Trust and safety
- CMP-63 Take notices about illegal content and answer each one in Compliance and governance
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/trust-and-safety/decisions-and-appeals/statement-of-reasons">Agent Wranglers trust and safety playbook</a>. In code you write, add a comment next to it with the same link.