import requests
url = "https://eu.app.clarifeye.ai/api/v1/projects/{project_id}/signals/"
payload = {
"feedback": "We need to cover the EU refund rules in the knowledge base",
"is_positive": False,
"context": { "additional_details": "Several customer calls last week asked about EU refunds and we had nothing to point them to." }
}
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({
feedback: 'We need to cover the EU refund rules in the knowledge base',
is_positive: false,
context: {
additional_details: 'Several customer calls last week asked about EU refunds and we had nothing to point them to.'
}
})
};
fetch('https://eu.app.clarifeye.ai/api/v1/projects/{project_id}/signals/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));curl --request POST \
--url https://eu.app.clarifeye.ai/api/v1/projects/{project_id}/signals/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"feedback": "We need to cover the EU refund rules in the knowledge base",
"is_positive": false,
"context": {
"additional_details": "Several customer calls last week asked about EU refunds and we had nothing to point them to."
}
}
'{
"id": "8f14e45f-ceea-467f-a8d9-23ad7f6b3a90",
"created_at": "2026-06-11T09:30:00Z",
"updated_at": "2026-06-11T09:30:00Z",
"given_by": {
"id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
"email": "[email protected]"
},
"status": "to_review",
"feedback": "We need to cover the EU refund rules in the knowledge base",
"context": {
"additional_details": "Several customer calls last week asked about EU refunds and we had nothing to point them to."
},
"is_positive": false
}{
"error": "User not found"
}{
"error": "Authentication credentials were not provided."
}{
"error": "You do not have permission to perform this action."
}Submit a signal
Submit a signal about the project’s content: the signal text itself,
plus optional context.additional_details with extra context for the
reviewer. The signal shows up in the review UI for domain experts.
Signal Types
| Type | is_positive Value | Description |
|---|---|---|
| Thumbs up | true | Positive signal |
| Thumbs down | false | Negative signal |
| Neutral | null | Neutral or no sentiment |
import requests
url = "https://eu.app.clarifeye.ai/api/v1/projects/{project_id}/signals/"
payload = {
"feedback": "We need to cover the EU refund rules in the knowledge base",
"is_positive": False,
"context": { "additional_details": "Several customer calls last week asked about EU refunds and we had nothing to point them to." }
}
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({
feedback: 'We need to cover the EU refund rules in the knowledge base',
is_positive: false,
context: {
additional_details: 'Several customer calls last week asked about EU refunds and we had nothing to point them to.'
}
})
};
fetch('https://eu.app.clarifeye.ai/api/v1/projects/{project_id}/signals/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));curl --request POST \
--url https://eu.app.clarifeye.ai/api/v1/projects/{project_id}/signals/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"feedback": "We need to cover the EU refund rules in the knowledge base",
"is_positive": false,
"context": {
"additional_details": "Several customer calls last week asked about EU refunds and we had nothing to point them to."
}
}
'{
"id": "8f14e45f-ceea-467f-a8d9-23ad7f6b3a90",
"created_at": "2026-06-11T09:30:00Z",
"updated_at": "2026-06-11T09:30:00Z",
"given_by": {
"id": "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed",
"email": "[email protected]"
},
"status": "to_review",
"feedback": "We need to cover the EU refund rules in the knowledge base",
"context": {
"additional_details": "Several customer calls last week asked about EU refunds and we had nothing to point them to."
},
"is_positive": false
}{
"error": "User not found"
}{
"error": "Authentication credentials were not provided."
}{
"error": "You do not have permission to perform this action."
}Authorizations
Use Authorization: Bearer <token>. The token is either a user token / OAuth access
token, or a service-account API key (cfk_...). A key is valid on every endpoint and
acts as its service account, an organization member with per-store permissions.
Refused keys answer 403 with Invalid API key., API key revoked.,
API key expired. or API key disabled..
Path Parameters
UUID of the project
Body
Response
Signal submitted successfully
User who submitted the signal
Show child attributes
Show child attributes
to_review: Signal pending review (default). Setting this on a closed signal reopens it and clearsreviewed_at/reviewed_by.reviewed: Signal has been revieweddismissed: Signal closed without action (won't fix, or archived praise)
to_review, reviewed, dismissed Signal text comment
Free-form context, echoed back as submitted at creation
Show child attributes
Show child attributes
true: Positive signalfalse: Negative signalnull: Neutral
The user message that was responded to (computed field)
Title of the conversation (computed field)
Auto-generated suggested action type
Auto-generated suggested action data
When the signal was closed. Cleared when a signal is reopened. Null for signals closed before this field existed.
User who closed the signal (null when closed by an unattended agent)
Show child attributes
Show child attributes
The chat message this signal is about (computed from context)
Surface that raised the signal (computed from context): PlaygroundConversation,
MCP, Manual, ObjectsExplorer, cross_store_conversation, or api when the
caller named none.