curl --request GET \
--url https://flows.super.ai/api/organizations/account-restriction \
--header 'Authorization: Bearer <token>'import requests
url = "https://flows.super.ai/api/organizations/account-restriction"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://flows.super.ai/api/organizations/account-restriction', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://flows.super.ai/api/organizations/account-restriction",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://flows.super.ai/api/organizations/account-restriction"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://flows.super.ai/api/organizations/account-restriction")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://flows.super.ai/api/organizations/account-restriction")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"automated": false,
"automation_statement": "<string>",
"clause": "<string>",
"confirmed_at": "2023-11-07T05:31:56Z",
"contest_email": "<string>",
"decided_at": "2023-11-07T05:31:56Z",
"effect": "<string>",
"facts": "<string>",
"ground": "illegal_content",
"ground_label": "<string>",
"redress": "<string>",
"restricted": false,
"restriction_type": "suspension",
"terms_url": "<string>"
}Why this account is restricted, if it is
The statement of reasons for a restricted account (FLO-2652, L9, L10).
Under DSA Art. 17 a restriction notice must state the concrete facts, the exact clause relied on, whether automated means were used, and the redress route. “Your account was limited” is non-compliant. This endpoint serves that statement, and the suspension screen renders it. The same screen serves the demoted state: a demoted account sits at a negative balance and can do nothing, indefinitely, which is an account restriction whether or not a human decided it.
Scoped to the caller’s own organization, with no path parameter, for the
same reason /credits is: this is a notice about you, and there is no version
of it that is about somebody else.
Served here rather than out of account_review because that table has no
tenant read policy at all — a subject learns about the review from an operator
answering a subject access request (L5). What comes back here is only what the
person is entitled to be told, and it carries no model reasoning: no rationale,
no confidence, no internal category.
restricted: false for the overwhelmingly common case. A trial that has simply
run out is deliberately not a restriction — it is a contractual default
reaching its end, and putting an accusation in front of somebody who did nothing
wrong would be worse than saying nothing.
curl --request GET \
--url https://flows.super.ai/api/organizations/account-restriction \
--header 'Authorization: Bearer <token>'import requests
url = "https://flows.super.ai/api/organizations/account-restriction"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://flows.super.ai/api/organizations/account-restriction', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://flows.super.ai/api/organizations/account-restriction",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://flows.super.ai/api/organizations/account-restriction"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://flows.super.ai/api/organizations/account-restriction")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://flows.super.ai/api/organizations/account-restriction")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"automated": false,
"automation_statement": "<string>",
"clause": "<string>",
"confirmed_at": "2023-11-07T05:31:56Z",
"contest_email": "<string>",
"decided_at": "2023-11-07T05:31:56Z",
"effect": "<string>",
"facts": "<string>",
"ground": "illegal_content",
"ground_label": "<string>",
"redress": "<string>",
"restricted": false,
"restriction_type": "suspension",
"terms_url": "<string>"
}Authorizations
JWT Bearer token authentication. Include your access token in the Authorization header as: Bearer YOUR_ACCESS_TOKEN
Example:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Response
Restriction status retrieved
The statement of reasons shown to a restricted account (L9, L10).
restricted is false for the overwhelmingly common case — an account that
is not restricted at all — and every other field is then null. A trial that
has simply run out is not a restriction: it is a contractual default
reaching its end, the user is shown the conversion screen instead, and
conflating the two would put an accusation in front of somebody who did
nothing wrong.
Whether automated means were used. Art. 17 requires saying so.
The terms clause relied on, cited so it can be looked up.
When a human confirmed an automatic decision.
What is and is not blocked.
The concrete finding, in one sentence.
The ground a restriction rests on. Named to the user, in ToS terms.
Deliberately terms-of-service categories rather than criminal characterisations (L11): whether a private provider's verdicts about suspected offences fall inside Art. 10 is unsettled, and we do not need to resolve that to tell somebody which rule they broke.
ILLEGAL_CONTENT and EXPLICIT_SEXUAL_CONTENT are separate grounds
end to end, with separate notices and separate handling, because adult
content is a terms matter and not a crime.
illegal_content, explicit_sexual_content, prohibited_use Plain-language name of the ground.
How to contest the decision, and to whom.
What was done to the account, in the statement of reasons' terms (L9, L10).
Both are account restrictions under DSA Art. 17 and both are owed the same statement. A demotion is one because a demoted account sits at a negative balance and can do nothing, indefinitely — a human having decided it changes who is accountable, not whether the user is owed an explanation.
suspension, demotion