curl --request POST \
--url https://api.moderationapi.com/v1/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"domain": "<string>",
"context": "<string>",
"brief": "<string>",
"usedByMinors": false
}
'import requests
url = "https://api.moderationapi.com/v1/projects"
payload = {
"name": "<string>",
"domain": "<string>",
"context": "<string>",
"brief": "<string>",
"usedByMinors": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
domain: '<string>',
context: '<string>',
brief: '<string>',
usedByMinors: false
})
};
fetch('https://api.moderationapi.com/v1/projects', 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://api.moderationapi.com/v1/projects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'domain' => '<string>',
'context' => '<string>',
'brief' => '<string>',
'usedByMinors' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.moderationapi.com/v1/projects"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"context\": \"<string>\",\n \"brief\": \"<string>\",\n \"usedByMinors\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.moderationapi.com/v1/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"context\": \"<string>\",\n \"brief\": \"<string>\",\n \"usedByMinors\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moderationapi.com/v1/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"context\": \"<string>\",\n \"brief\": \"<string>\",\n \"usedByMinors\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"domain": "<string>",
"context": "<string>",
"globalFlaggingMode": "DRY_RUN",
"enableRequestLogging": true,
"casebookEnabled": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"secretKey": "<string>"
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}Create a project
Create a project with one channel, a review queue inbox and a secret API key. Give a domain or context and the project suggests policies for the platform. Needs the projects:write permission and a key that reaches all projects.
curl --request POST \
--url https://api.moderationapi.com/v1/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"domain": "<string>",
"context": "<string>",
"brief": "<string>",
"usedByMinors": false
}
'import requests
url = "https://api.moderationapi.com/v1/projects"
payload = {
"name": "<string>",
"domain": "<string>",
"context": "<string>",
"brief": "<string>",
"usedByMinors": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
domain: '<string>',
context: '<string>',
brief: '<string>',
usedByMinors: false
})
};
fetch('https://api.moderationapi.com/v1/projects', 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://api.moderationapi.com/v1/projects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'domain' => '<string>',
'context' => '<string>',
'brief' => '<string>',
'usedByMinors' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.moderationapi.com/v1/projects"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"context\": \"<string>\",\n \"brief\": \"<string>\",\n \"usedByMinors\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.moderationapi.com/v1/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"context\": \"<string>\",\n \"brief\": \"<string>\",\n \"usedByMinors\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.moderationapi.com/v1/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"domain\": \"<string>\",\n \"context\": \"<string>\",\n \"brief\": \"<string>\",\n \"usedByMinors\": false\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"domain": "<string>",
"context": "<string>",
"globalFlaggingMode": "DRY_RUN",
"enableRequestLogging": true,
"casebookEnabled": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"secretKey": "<string>"
}{
"code": "BAD_REQUEST",
"message": "Invalid input data",
"issues": []
}{
"code": "UNAUTHORIZED",
"message": "Authorization not provided",
"issues": []
}{
"code": "FORBIDDEN",
"message": "Insufficient access",
"issues": []
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The project's name.
1 - 35The website or app the project moderates content for. Used to write the context when none is given.
255What the platform is and who uses it.
2000What you moderate, the problems you see and your guidelines.
2000Whether children use the platform.
Response
Project created successfully
The ID of the project.
The project's name.
The project's description.
The website or app the project moderates content for.
What the platform is and who uses it. AI moderation reads it to judge content in context.
ACTIVE flags content. DRY_RUN evaluates content without flagging it, for testing a setup.
DRY_RUN, ACTIVE Whether moderated content is stored and shown in the dashboard.
Whether decisions made in the review queue are recorded in the project's casebook.
When the project was created.
When the project was last changed.
A secret API key for the new project. Use it to moderate content in this project. It is also shown in the project's settings.
Was this page helpful?