Content Hash List Feedback
Overview
The Hash Feedback API allows users of our Content Hash List to provide feedback to our system on an individual hash basis. This feedback mechanism helps improve the accuracy and effectiveness of our content classification system by enabling users to report false positives, classification errors, duplicates, matches and other general feedback.
Open API References:
Get feedback catergories
To submit feedback, you must first retrieve a list of available feedback categories. This will allow you to include the relevant feedback category ID in your request.
- Python
- TypeScript
- cURL
import requests
url = "https://app.terrorismanalytics.org/hash-list/v2/feedback/categories?<params>"
headers = {
"Authorization": f'Bearer {token}"
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
print(response.json())
const url = "https://app.terrorismanalytics.org/hash-list/v2/feedback/categories?<params>"
const makeRequest = async (url: string) => {
const response = await fetch(url, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
});
const data = await response.json();
console.log(data);
};
const result = await makeRequest(url)
curl -X GET \
https://app.terrorismanalytics.org/hash-list/v2/feedback/categories?<params> \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
Query Parameters
Parameter | Type | Required | Default | Description |
---|---|---|---|---|
id | integer | No | - | Filter results by category ID |
name | string | No | - | Filter results by category name |
limit | integer | No | 20 | Number of results to return per page (max 100) |
offset | integer | No | 0 | Number of results to skip for pagination |
Response Format
The API returns paginated results with the following structure:
Field | Type | Description |
---|---|---|
count | integer | Total number of available results |
next | string/null | URL for the next page of results, null if last page |
previous | string/null | URL for the previous page of results, null if first page |
results | array | Array of category objects for the current page |
Category Object
Field | Type | Description |
---|---|---|
id | integer | Unique identifier for the category |
name | string | Category name/code |
description | string | Human-readable description of the category |
Example Response
{
"count": 6,
"next": null,
"previous": "https://app.terrorismanalytics.org/hash-list/v2/feedback/categories",
"results": [
{
"id": 1,
"name": "FALSE_POSITIVE",
"description": "Bad hash quality or Non TVEC"
}
{
"id": 2,
"name": "INCLUSION",
"description": "Why is this included ?"
}
...
]
}
Sending feedback
Base URL:
https://app.terrorismanalytics.org/hash-list/v2/feedback
Sending feedback is simple. Just send a POST
request to the Base URL with the following fields included in the request body.
Request Body
Field | Type | Required | Description |
---|---|---|---|
hash | integer | Yes | Hash ID being reported on |
category | integer | Yes | Category ID for the feedback type |
description | string | No | Detailed description of the feedback or issue |
- Python
- TypeScript
- cURL
import requests
url = "https://app.terrorismanalytics.org/hash-list/v2/feedback"
body = {
"hash":4337,
"category":1,
"description":"Lorem Ipsum is simply dummy text of the printing and typesetting industry"
}
headers = {
"Authorization": f'Bearer {token}"
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, body=body)
print(response.json())
type THashFeedBack = {
hash: number,
category: number,
description: string
}
const url = "https://app.terrorismanalytics.org/hash-list/v2/feedback"
const body: THashFeedBack = {
hash: 4337,
category: 1,
description: "Lorem Ipsum is simply dummy text of the printing and typesetting industry"
}
const makeRequest = async (url: string, body: THashFeedBack) => {
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(body)
});
const data = await response.json();
console.log(data);
};
const result = await makeRequest(url, body);
curl -X POST "https://app.terrorismanalytics.org/hash-list/v2/feedback" \
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
-H "Content-Type: application/json" \
-d '{
"hash": 4337,
"category": 1,
"description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry"
}'
Example response
{
"hash": 4337,
"category": 1,
"description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.",
"user": 26
}
Response Format
Field | Type | Description |
---|---|---|
hash | integer | Hash ID that was reported on |
category | integer | Category ID for the feedback type |
description | string | Detailed description of the feedback or issue |
user | integer | User ID of the person who submitted the feedback |
Feedback Status
You can make a GET
request to the Base URL to get a list of all feedback entries you have submitted to us along with the current status of the feedback including an analyst response and an analyst decision.
- Python
- TypeScript
- cURL
import requests
url = "https://app.terrorismanalytics.org/hash-list/v2/feedback"
headers = {
"Authorization": f'Bearer {token}"
"Content-Type": "application/json"
}
response = requests.get(url, headers=headers)
print(response.json())
type THashFeedBack = {
hash: number,
category: number,
description: string
}
const url = "https://app.terrorismanalytics.org/hash-list/v2/feedback"
const makeRequest = async (url: string, body: THashFeedBack) => {
const response = await fetch(url, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
});
const data = await response.json();
console.log(data);
};
const result = await makeRequest(url, body);
curl -X GET "https://app.terrorismanalytics.org/hash-list/v2/feedback" \
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
-H "Content-Type: application/json" \
Example Response
{
"count": 21,
"next": "https://app.terrorismanalytics.org/hash-list/v2/feedback?analyst_decision=REMOVED&limit=5&offset=10&response_sent=true&status=CLOSED",
"previous": "https://app.terrorismanalytics.org/hash-list/v2/feedback?analyst_decision=REMOVED&limit=5&response_sent=true&status=CLOSED",
"results": [
{
"id": 12,
"user": {
"id": 99,
"username": "Vader"
},
"analyst": {
"id": 22,
"username": "Luke"
},
"category": {
"id": 2,
"name": "INCLUSION",
"description": "Why is this included ?"
},
"hash": {
"id": 123,
"hash_digest": "0f0567cd2e7bbb709e6401697f1bd17d"
},
"content_id": 241,
"description": "Lorem Ipsum is simply dummy text of the printing and typesetting industry.",
"analyst_response": "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
"created_on": "2025-05-22T14:18:54.699590",
"updated_on": "2025-05-22T14:25:03.840497",
"status": "CLOSED",
"analyst_decision": "NOT_REMOVED",
"response_sent": true
},
]
}
Query Parameters
Parameter | Type | Required | Default | Description |
---|---|---|---|---|
limit | integer | No | 20 | Number of results to return per page |
offset | integer | No | 0 | Number of results to skip for pagination |
status | string | No | - | Filter by feedback status (OPEN , CLOSED ) |
response_sent | boolean | No | - | Filter by whether the email response has been sent (true , false ) |
analyst_decision | string | No | - | Filter by analyst decision (REMOVED , NOT_REMOVED , PENDING ) |
Response Format
Field | Type | Description |
---|---|---|
count | integer | Total number of available results |
next | string/null | URL for the next page of results, null if last page |
previous | string/null | URL for the previous page of results, null if first page |
results | array | Array of feedback objects for the current page |
Feedback Object
Field | Type | Description |
---|---|---|
id | integer | Unique identifier for the feedback entry |
user | User | User who submitted the feedback |
analyst | User(Analyst) | Analyst who reviewed the feedback |
category | Category | Feedback category information |
hash | Hash | Hash information being reported on |
content_id | integer | Associated content identifier |
description | string | User's description of the feedback |
analyst_response | string | Analyst's response to the feedback |
created_on | string | ISO timestamp when feedback was created |
updated_on | string | ISO timestamp when feedback was last updated |
status | string | Current status (OPEN , CLOSED ) |
analyst_decision | string | Final decision (REMOVED , NOT_REMOVED , PENDING ) |
response_sent | boolean | Whether a response has been sent to user |
User Object
Field | Type | Description |
---|---|---|
id | integer | User's unique identifier |
username | string | User's username |
Category Object
Field | Type | Description |
---|---|---|
id | integer | Category's unique identifier |
name | string | Category name/code |
description | string | Human-readable description of the category |
Hash Object
Field | Type | Description |
---|---|---|
id | integer | Hash's unique identifier |
hash_digest | string | The actual hash digest value |
Response notifications
Once you submit a feedback request, we will automatically receive an email with the details of your issue. Our analysts aim to respond within 3 to 5 working days. You will receive a response at the email address you provided during onboarding.