Skip to reference

Qualiteam API reference (1.0.0)

Read projects, conversations, evaluation results and settings from your own integration. All endpoints are read-only.

Base URL: https://qualiteam.ai/api/v1

Authentication

Create an API key in Company → API Access. Send it in the Authorization header:

export QUALITEAM_API_KEY='your-key-from-api-access'
curl --fail-with-body 'https://qualiteam.ai/api/v1/projects' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Keep keys in a server-side secret manager, out of browser code, URLs and logs. API keys allow reading data only; they cannot manage integrations or change permissions. Keys do not expire automatically. Administrators can revoke a key or rotate the integration's key, retiring all older keys within 24 hours. Revocation takes effect on the next request.

Resources and permissions

GET /projects lists granted projects. GET /projects/{project_id} returns metadata, including reporting timezone and current score display direction. Any project grant allows this metadata; its shared instructions (description) require rules.read or criteria.read, otherwise the field is null.

Each resource has list and detail endpoints:

GET /projects/{project_id}/{resource}
GET /projects/{project_id}/{resource}/{resource_id}
Resource Required permission
managers managers.read
conversations conversations.read
messages messages.read and conversations.read
evaluations, reviews, attribute-results evaluations.read
appeals appeals.read
alerts, alert-definitions alerts.read
criteria criteria.read
attributes attributes.read
evaluation-tags evaluation_tags.read
flows flows.read
rules rules.read
knowledge-base knowledge_base.read
notification-rules, notification-recipients notifications.read
notifications notification_events.read

Each permission covers the whole selected project, including unpublished evaluations, pending alerts and conversation history from disabled or disconnected sources. Resource access matches a company administrator's. Notification events additionally require that their saved content remains accessible to the original recipient. V1 excludes writes, billing, user management, playground and benchmarks.

Resource permissions include provider IDs (such as agent and chat IDs) and stored text. Email and Telegram handles require contacts.read; otherwise they are null. Personal data inside messages, names, comments and instructions remains readable without this permission. PII redaction follows project settings at import time; the API does no further redaction.

Conversation detail includes evaluation, alert and tag IDs only with the relevant permission (otherwise null). Alerts include their saved condition and matched-value snapshots; full evaluations require their own permission.

Project rules, criteria instructions and extracted knowledge-base text require their respective permissions. The API excludes credentials, access hashes, internal system prompts, usage/billing details and internal job payloads.

Pagination and filters

Lists return:

{
  "data": [{ "id": "example-resource-id" }],
  "next_cursor": "opaque-continuation-token"
}

limit defaults to 50, with a maximum of 100. Lists have no automatic total count. Pass the returned next_cursor as cursor, keeping the same project, resource and filters, until it is null. You can change the page size. Cursors are signed, belong to one integration and do not freeze the data.

With manager_ids, the API resolves agents for legacy or unevaluated conversations in batches. Pages can have fewer than limit results, even zero, while still returning a next_cursor. Continue until the cursor is null.

Results sort by resource ID ascending. Messages sort by conversation ID, timestamp, then message ID, with missing legacy timestamps first. Repeat array parameters as ids=id1&ids=id2, up to 100 values. Unknown parameters and unsupported filter/resource combinations are rejected.

Filter Where supported
ids Database resources and projects
conversation_ids Conversations and their child resources
manager_ids Managers; message authors; card attribution for evaluations, reviews and appeals; conversation attribution for conversations, attribute results and alerts
evaluation_id Reviews, appeals
attribute_id Attribute results, alert definitions
alert_id Alerts
source_id Managers, conversations, messages
status Evaluations (result_status), appeals, alerts
state Conversations
published Evaluations
approved Evaluations, reviews
created_from, created_to Resources with created_at
updated_from, updated_to Resources with updated_at
evaluated_from, evaluated_to Evaluations
published_from, published_to Evaluations
triggered_from, triggered_to Alerts

Projects support ids, limit, cursor; flows support limit, cursor. Most lists are compact. Detail endpoints add criteria instructions, knowledge text, appeal comments and per-criterion results. Message lists include text for batch transcript reads; notification lists include the full notification content.

Date filters use ISO 8601 timestamps with Z or a timezone offset. Date-only values and timestamps without a timezone return 422. Each filter applies to its named timestamp, including the lower bound and excluding the upper bound.

Message lists require 1 to 100 conversation_ids, including on later pages. IDs outside the granted project return no data. in_evaluation_window marks timestamps inside loaded_from/loaded_to; is_internal_note is independent. Reply and forward snapshots provide context and do not count as messages or evaluation activity.

curl --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/messages' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY" \
  --data-urlencode 'conversation_ids=CONVERSATION_ID' \
  --data-urlencode 'limit=100'

Evaluation and history semantics

Scores and dates

  • score and total_score are the effective reviewed values; each criterion's model_score keeps the original model value. Use the card's scoring mode, min/max and the project's current addition_score_direction to interpret scores. Direction affects display only.
  • attribute-results belong to conversations and include effective and original numeric/time values and category sets. Numeric/time edits follow the application's QC rules. Original model category sets are immutable; deleted categories remain readable in history.
  • Approval and publication are separate. evaluated_at records evaluation, published_at records publication, and loaded_from/loaded_to define conversation coverage. As in reporting, reporting_date uses the last in-window message (or window end) and project timezone.

Agents and deleted cards

  • A conversation can have several cards with different agents. Each card has attributed_manager_ids; the conversation combines these, with fallback attribution for unevaluated or legacy data. Manager filters follow the same rules.
  • Reviews and appeals use their own card's agents. Without a card, their attribution is unknown: manager_ids filters exclude them, but unfiltered lists include them.
  • IDs stay stable until deletion. A replacement card gets a new ID. Reviews and appeals can survive with evaluation_id: null as conversation history; API reads never attach them to a replacement.
  • An approved review without a card can keep the evaluation card's approved true if the conversation has exactly one card and no card-linked review. Ownership remains unknown, so review_id, approved_at and reviewer references stay null. With multiple cards, it approves none.

Alerts and notifications

  • Alerts belong to conversations and identify neither a responsible agent nor a card. All states (active, pending_approval, read), historical hits and soft-deleted definitions remain readable. triggered_at records the original hit; activation/read changes use updated_at.
  • Notification rules list alert/appeal subscriptions, recipients and manager IDs. They do not describe reporting lines or publication-to-team-lead routing.
  • Saved recipients may be ineligible for built-in delivery. Before sending project data, verify recipient access and channel ownership. The saved telegram_handle may have changed owners and does not verify a Telegram destination.

app_url opens the relevant application screen and requires a user login with project access.

Notification feed

Use GET https://qualiteam.ai/api/v1/projects/{project_id}/notifications to read notifications that Qualiteam has already prepared for recipients. Each item includes the recipient, managers, conversations, title, text, links and event data, ready to send through your messenger. No per-notification request is needed. GET https://qualiteam.ai/api/v1/projects/{project_id}/notifications/{id} returns the same content when you need a single notification.

Field Meaning
recipient Who this notification was prepared for.
managers The related support agents (manager means agent in this API), with their agent tags.
conversations All related conversations, their chat tags and manager_ids referencing managers[].id. Present for every event type.
data Event-specific facts, such as fired alerts or appeal outcomes. Use the top-level conversations for the common conversation references.
title, text, links Prepared message content for your messenger.

There are three separate kinds of tags. Chat tags and agent tags are string lists. Evaluation tags have IDs in evaluation_tag_ids, with definitions from evaluation-tags and their own evaluation_tags.read permission.

In notifications, conversations[].chat_tags and managers[].tags are saved at creation. Changing source tags does not rewrite them. In contrast, GET https://qualiteam.ai/api/v1/projects/{project_id}/conversations (and its detail endpoint) returns current chat_tags, and managers[].name in notifications is the current agent name. Telegram, TimelinesAI and Helpshift chat tags are supported; Intercom, Zendesk and missing chat metadata return [].

Both notification tag fields require only notification_events.read; no additional managers.read or conversations.read is needed. Chat tags hidden from a linked recipient are omitted at creation and hidden again if access is later revoked. Tags omitted at creation do not appear later when access is restored. Manual recipients follow their administrator-configured access. Old notifications still include related conversation and agent IDs, but their tag arrays are []. Tag fields are never null; an empty array can mean no tags, unavailable tags, hidden tags or a pre-feature notification.

Ask an administrator to grant notification_events.read in Company → API Access. Existing keys do not gain this permission automatically. notifications.read still covers settings only. Contact fields also require contacts.read.

The feed follows existing alert/appeal rules and agent-publication settings. One notification is shared across its delivery channels. Successful email/Telegram delivery does not remove it from the feed. Your integration handles delivery to your messenger; the API has no delivery acknowledgement endpoint.

  1. At first connection, choose and persist created_from, for example 2026-10-21T09:00:00Z. Read the list with this date; optionally add event_type or recipient_id.
  2. Process the complete notifications in data, using notification IDs to prevent duplicates.
  3. Follow next_cursor until it is null, including through empty pages. Save your checkpoint only after processing its page or storing its notifications in your durable delivery queue.
  4. Save the final resume_cursor; use it as cursor on the next poll and after restarts, with the same filters and the original created_from.

created_from includes its boundary; created_to excludes it. Both filter created_at and require an ISO 8601 timestamp with a timezone. Equivalent offsets are normalized to UTC. Invalid dates return 422, a reversed range returns 400, and equal boundaries return an empty page. Changing filters with a cursor returns 400.

For continuous polling, omit created_to. For a bounded export, supply both dates, for example created_from=2026-10-21T00:00:00Z and created_to=2026-10-22T00:00:00Z. Without dates, reading starts at the oldest retained feed position. Existing consumers can keep using their date-less cursors. To add date filters, restart without a cursor and deduplicate against saved notification IDs.

The order remains feed_sequence ASC: the order notifications appear in the feed. A late-committing notification may have an earlier created_at; it still arrives after your saved cursor if it matches your fixed date range. Do not replace the cursor with the last notification's timestamp or move created_from forward on each poll.

A page with one notification looks like this (IDs and cursor are illustrative):

{
  "data": [{
    "id": "notification-123",
    "project_id": "project-123",
    "event_type": "alert_fired",
    "created_at": "2026-10-21T09:00:00Z",
    "recipient": {
      "id": "recipient-123", "kind": "recipient", "name": "Team lead",
      "user_id": null, "email": null, "telegram_handle": null
    },
    "managers": [{"id": "manager-123", "name": "Alex", "tags": ["affiliate"]}],
    "conversations": [{
      "conversation_id": "conversation-123",
      "manager_ids": ["manager-123"],
      "chat_tags": ["weekly_review", "priority"]
    }],
    "title": "Notifications from Support",
    "text": "Support chat: Low score. View conversation (https://qualiteam.ai/conversation/conversation-123)",
    "links": [{
      "label": "View conversation",
      "url": "https://qualiteam.ai/conversation/conversation-123"
    }],
    "data": {
      "type": "alert_fired",
      "conversations": [{
        "conversation_id": "conversation-123", "topic": "Payment question",
        "chat_name": "Support chat", "manager_names": ["Alex"],
        "alerts": [{"id": "alert-123", "name": "Low score"}]
      }]
    }
  }],
  "next_cursor": null,
  "resume_cursor": "opaque-resume-token"
}

Committed notifications normally appear within a few seconds. They remain available for 90 days after entering the feed; pre-upgrade queued notifications are not added. HTTP 410 means the cursor is too old: restart without it using the same filters and deduplicate against saved IDs. An expired history window cannot be recovered through the API.

Access is rechecked when reading. Deleted sources or recipients, or lost membership can make an older notification unavailable (404 on detail). Contact edits and Telegram connection state do not erase API history. Publication notifications still require publication access and enabled agent-publication settings. Recipient contact fields describe the saved notification. Content is a saved snapshot; dates and links in the message describe that notification.

For publication notifications, recipient IDs are platform user IDs (kind: agent); other events use notification-recipient IDs (kind: recipient). Alerts identify conversations, not a responsible agent. The managers list identifies the permitted related agents. conversations[].manager_ids uses the saved attribution of permitted evaluation cards and can be empty, including for detached appeals; it does not identify an agent responsible for an alert. Publication references include all conversations, even when the message text shows only a preview. If an agent profile has no name, notifications return agent_name: "" in their event data.

Polling notifications

Call this function on each poll with your persisted created_from and saved cursor, or None for the cursor on the first run. Keep the same date after restarts. Supply enqueue_once(id, notification) to store the full notification in your durable delivery queue, deduplicated by ID, and save_cursor(cursor) to persist the checkpoint. Send queued messages through your messenger separately. If storing a page fails, its checkpoint is not advanced and the next poll can retry it.

import os
import requests


def poll_notifications(project_id, created_from, cursor, enqueue_once, save_cursor):
    base = "https://qualiteam.ai/api/v1"
    params = {"limit": 100, "created_from": created_from}
    if cursor is not None:
        params["cursor"] = cursor

    with requests.Session() as session:
        session.headers["Authorization"] = f"Bearer {os.environ['QUALITEAM_API_KEY']}"
        while True:
            response = session.get(
                f"{base}/projects/{project_id}/notifications",
                params=params, timeout=30,
            )
            response.raise_for_status()
            page = response.json()
            for notification in page["data"]:
                enqueue_once(notification["id"], notification)

            cursor = page["next_cursor"] or page["resume_cursor"]
            save_cursor(cursor)
            if page["next_cursor"] is None:
                return cursor
            params["cursor"] = cursor

Match conversations to agents

Use IDs to associate each conversation with its agents and their tags. No further API calls are needed:

def conversations_with_agents(notification):
    agents = {agent["id"]: agent for agent in notification["managers"]}
    for conversation in notification["conversations"]:
        yield conversation, [agents[agent_id] for agent_id in conversation["manager_ids"]]

Polling evaluations

Read currently published evaluations within an evaluation-time range from your server. Your integration handles message composition and delivery.

import os
import requests

base = "https://qualiteam.ai/api/v1"
project_id = "PROJECT_ID"
params = {
    "published": "true",
    "evaluated_from": "2026-10-01T00:00:00Z",
    "evaluated_to": "2026-10-08T00:00:00Z",
    "limit": 100,
}
headers = {"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"}

with requests.Session() as session:
    while True:
        response = session.get(
            f"{base}/projects/{project_id}/evaluations",
            headers=headers, params=params, timeout=30,
        )
        response.raise_for_status()
        page = response.json()
        for evaluation in page["data"]:
            print(evaluation["id"], evaluation["total_score"], evaluation["app_url"])
        if page["next_cursor"] is None:
            break
        params["cursor"] = page["next_cursor"]

The API returns current state, so pages can change during a scan. When polling, re-read the relevant period and deduplicate by resource ID. Child changes may leave the parent's timestamp unchanged. Polling can miss deletions, unpublish/republish cycles and intermediate states. These resource endpoints have no change log or deletion markers; ID order cannot identify new items since the last poll. The notification feed has its own resumable cursor and 90-day history. Webhooks are not available.

Limits and errors

Limits default to 60 requests/minute per integration and 300/minute per company, shared across keys and workers. Counters reset in fixed minute windows; quota rejections also count toward the company limit. Administrators cannot change these server limits.

For 429, wait the Retry-After seconds before retrying. For 503 or temporary network errors, use bounded backoff. Authentication and permission errors require fixing the key or grants.

HTTP status Meaning
400 Invalid cursor, unsupported filters or missing message conversation IDs
401 Missing, invalid, expired or revoked API key
403 Project is granted, but a required scope is missing
404 Resource/project is absent or outside the grant
405 Unsupported write operation
409 Legacy flow storage has an ambiguous project prefix; contact support
410 Notification cursor expired; restart without a cursor to read retained history
422 Invalid parameter type, range or unknown parameter
429 Integration or company rate limit
503 Database busy; retry shortly

Errors use {"error":{"code":403,"message":"Missing required API scope"}}. Data and key-creation responses use Cache-Control: no-store. OpenAPI is public, with no customer data. The reference shows examples without sending API requests.

Versioning

/api/v1 preserves existing fields, types and meanings. Ignore unfamiliar fields from compatible optional additions. Breaking changes use /api/v2. V1 remains supported for at least 180 days after a migration announcement, with migration instructions and a retirement date. Internal frontend endpoints follow a separate lifecycle outside this contract.

Notifications

Ready notifications for your own delivery integration. One record per recipient, shared across email and Telegram. History lasts 90 days after appearing in the feed. Existing notification rules and publication settings determine which events are created. Each list item includes the full text, recipient, managers, conversations, links and event data, ready for your messenger without per-notification requests. Detail returns the same content for a single notification. Read all pages with next_cursor, then save resume_cursor for the next poll after processing the page or storing it in your durable delivery queue. Save created_from at first connection and keep it unchanged with each cursor, including after restarts. created_from is inclusive and created_to exclusive, both on created_at with a required timezone. Omit created_to for continuous polling; use both dates for a bounded export. Feed order is feed_sequence ASC (appearance order), not creation time: late commits can have an older created_at and still appear after your cursor if they match the date range. On 410, restart without a cursor using the same filters and deduplicate saved IDs. Recipient access is rechecked on every read. Channel delivery does not consume the feed. managers[].tags and conversations[].chat_tags are saved tag snapshots; conversations[].manager_ids links conversations to managers[].id without matching names or making extra requests. Older notifications keep their conversation/agent references with empty tag arrays. Only notification_events.read is needed for both tag types; hidden recipient chat tags remain hidden.

List notifications

GET https://qualiteam.ai/api/v1/projects/{project_id}/notifications

Ready notifications for your own delivery integration. One record per recipient, shared across email and Telegram. History lasts 90 days after appearing in the feed. Existing notification rules and publication settings determine which events are created. Each list item includes the full text, recipient, managers, conversations, links and event data, ready for your messenger without per-notification requests. Detail returns the same content for a single notification. Read all pages with next_cursor, then save resume_cursor for the next poll after processing the page or storing it in your durable delivery queue. Save created_from at first connection and keep it unchanged with each cursor, including after restarts. created_from is inclusive and created_to exclusive, both on created_at with a required timezone. Omit created_to for continuous polling; use both dates for a bounded export. Feed order is feed_sequence ASC (appearance order), not creation time: late commits can have an older created_at and still appear after your cursor if they match the date range. On 410, restart without a cursor using the same filters and deduplicate saved IDs. Recipient access is rechecked on every read. Channel delivery does not consume the feed. managers[].tags and conversations[].chat_tags are saved tag snapshots; conversations[].manager_ids links conversations to managers[].id without matching names or making extra requests. Older notifications keep their conversation/agent references with empty tag arrays. Only notification_events.read is needed for both tag types; hidden recipient chat tags remain hidden.

Required permissions: notification_events.read.

Pagination and filters.

Required permissions: notification_events.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Use next_cursor for another page, or resume_cursor to poll for new notifications. Keep filters unchanged. A page may be empty when saved content is no longer authorized. An expired cursor returns 410.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

event_typequeryNo Any of: (NotificationEventType; null)
anyOf variant: null

Filter by alert_fired, appeal_created, appeal_resolved or agent_conversations_published.

recipient_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Recipient ID from a notification. Publication notifications use the recipient's platform user ID.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/notifications' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/notifications",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

NotificationFeedPage
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
410

Notification cursor is older than the retained history. Restart without a cursor and deduplicate saved IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 410,
    "message": "Notification cursor is older than the retained history. Restart without a cursor and deduplicate saved IDs."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get notification

GET https://qualiteam.ai/api/v1/projects/{project_id}/notifications/{notification_id}

Ready notifications for your own delivery integration. One record per recipient, shared across email and Telegram. History lasts 90 days after appearing in the feed. Existing notification rules and publication settings determine which events are created. Each list item includes the full text, recipient, managers, conversations, links and event data, ready for your messenger without per-notification requests. Detail returns the same content for a single notification. Read all pages with next_cursor, then save resume_cursor for the next poll after processing the page or storing it in your durable delivery queue. Save created_from at first connection and keep it unchanged with each cursor, including after restarts. created_from is inclusive and created_to exclusive, both on created_at with a required timezone. Omit created_to for continuous polling; use both dates for a bounded export. Feed order is feed_sequence ASC (appearance order), not creation time: late commits can have an older created_at and still appear after your cursor if they match the date range. On 410, restart without a cursor using the same filters and deduplicate saved IDs. Recipient access is rechecked on every read. Channel delivery does not consume the feed. managers[].tags and conversations[].chat_tags are saved tag snapshots; conversations[].manager_ids links conversations to managers[].id without matching names or making extra requests. Older notifications keep their conversation/agent references with empty tag arrays. Only notification_events.read is needed for both tag types; hidden recipient chat tags remain hidden.

Required permissions: notification_events.read.

Required permissions: notification_events.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

notification_idpathYes string

Notification ID from this project's feed.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/notifications/NOTIFICATION_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/notifications/NOTIFICATION_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

NotificationDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Projects

Granted projects, reporting timezone and score settings. Any grant allows project metadata. Shared instructions in description require rules.read or criteria.read.

List projects

GET https://qualiteam.ai/api/v1/projects

Granted projects, reporting timezone and score settings. Any grant allows project metadata. Shared instructions in description require rules.read or criteria.read.

Required permissions: Any grant on the project.

Pagination and filters.

Required permissions: Any project grant.

Parameters

NameLocationRequiredSchema and description
limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_ProjectSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get project

GET https://qualiteam.ai/api/v1/projects/{project_id}

Granted projects, reporting timezone and score settings. Any grant allows project metadata. Shared instructions in description require rules.read or criteria.read.

Required permissions: Any grant on the project.

Required permissions: Any project grant.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

ProjectDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Managers

Support agents and their provider IDs, including agents no longer evaluated. Manager means support agent. tags contains the agent's current string tags. Email requires the additional contacts.read permission.

List managers

GET https://qualiteam.ai/api/v1/projects/{project_id}/managers

Support agents and their provider IDs, including agents no longer evaluated. Manager means support agent. tags contains the agent's current string tags. Email requires the additional contacts.read permission.

Required permissions: managers.read.

Pagination and filters.

Required permissions: managers.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

source_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact external provider ID, as returned by this resource.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/managers' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/managers",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_ManagerSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get manager

GET https://qualiteam.ai/api/v1/projects/{project_id}/managers/{resource_id}

Support agents and their provider IDs, including agents no longer evaluated. Manager means support agent. tags contains the agent's current string tags. Email requires the additional contacts.read permission.

Required permissions: managers.read.

Required permissions: managers.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/managers/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/managers/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

ManagerDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Conversations

Saved conversations, coverage windows and agent attribution, including history from disabled sources. Lists and detail include current chat_tags with conversations.read. Telegram, TimelinesAI (effective labels and local tags) and Helpshift are supported; other sources or missing metadata return []. Detail includes evaluation, alert and evaluation-tag IDs only with their respective read permissions.

List conversations

GET https://qualiteam.ai/api/v1/projects/{project_id}/conversations

Saved conversations, coverage windows and agent attribution, including history from disabled sources. Lists and detail include current chat_tags with conversations.read. Telegram, TimelinesAI (effective labels and local tags) and Helpshift are supported; other sources or missing metadata return []. Detail includes evaluation, alert and evaluation-tag IDs only with their respective read permissions.

Required permissions: conversations.read.

Pagination and filters.

Required permissions: conversations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

source_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact external provider ID, as returned by this resource.

statequeryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact saved conversation state.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/conversations' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/conversations",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_ConversationSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get conversation

GET https://qualiteam.ai/api/v1/projects/{project_id}/conversations/{resource_id}

Saved conversations, coverage windows and agent attribution, including history from disabled sources. Lists and detail include current chat_tags with conversations.read. Telegram, TimelinesAI (effective labels and local tags) and Helpshift are supported; other sources or missing metadata return []. Detail includes evaluation, alert and evaluation-tag IDs only with their respective read permissions.

Required permissions: conversations.read.

Required permissions: conversations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/conversations/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/conversations/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

ConversationDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Messages

Stored message text, internal notes and reply/forward context. Lists require 1–100 conversation IDs. Messages sort by conversation ID, timestamp, then message ID; missing legacy timestamps come first. Text may contain personal data even without contacts.read.

List messages

GET https://qualiteam.ai/api/v1/projects/{project_id}/messages

Stored message text, internal notes and reply/forward context. Lists require 1–100 conversation IDs. Messages sort by conversation ID, timestamp, then message ID; missing legacy timestamps come first. Text may contain personal data even without contacts.read.

Required permissions: conversations.read and messages.read.

Pagination and filters.

Required permissions: conversations.read, messages.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryYes array · items: string

minItems: 1

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100. Required on every page of message results.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

source_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact external provider ID, as returned by this resource.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/messages' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY" \
  --data-urlencode 'conversation_ids=CONVERSATION_ID' \
  --data-urlencode 'limit=50'

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/messages",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    params={"conversation_ids": "CONVERSATION_ID", "limit": 50},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_MessageSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get message

GET https://qualiteam.ai/api/v1/projects/{project_id}/messages/{resource_id}

Stored message text, internal notes and reply/forward context. Lists require 1–100 conversation IDs. Messages sort by conversation ID, timestamp, then message ID; missing legacy timestamps come first. Text may contain personal data even without contacts.read.

Required permissions: conversations.read and messages.read.

Required permissions: conversations.read, messages.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/messages/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/messages/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

MessageSummary
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Evaluations

Published and unpublished evaluation cards, with effective reviewed scores and original model scores. Approval and publication are independent. A conversation can have several cards. Each card has its own agent attribution and keeps its ID until deletion.

List evaluations

GET https://qualiteam.ai/api/v1/projects/{project_id}/evaluations

Published and unpublished evaluation cards, with effective reviewed scores and original model scores. Approval and publication are independent. A conversation can have several cards. Each card has its own agent attribution and keeps its ID until deletion.

Required permissions: evaluations.read.

Pagination and filters.

Required permissions: evaluations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

statusqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact saved status; evaluations filter on result_status.

publishedqueryNo Any of: (boolean; null)
anyOf variant: boolean
anyOf variant: null

Filter on publication to agents. Omit to include both published and unpublished cards.

approvedqueryNo Any of: (boolean; null)
anyOf variant: boolean
anyOf variant: null

Filter on effective approval. Approval is independent of publication.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
evaluated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on evaluated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
evaluated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on evaluated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
published_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on published_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
published_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on published_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluations' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluations",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_EvaluationSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get evaluation

GET https://qualiteam.ai/api/v1/projects/{project_id}/evaluations/{resource_id}

Published and unpublished evaluation cards, with effective reviewed scores and original model scores. Approval and publication are independent. A conversation can have several cards. Each card has its own agent attribution and keeps its ID until deletion.

Required permissions: evaluations.read.

Required permissions: evaluations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluations/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluations/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

EvaluationDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Reviews

Saved review decisions, comments and overrides. Reviews can survive a deleted evaluation with evaluation_id: null; API reads never attach them to replacement cards. Manager filters exclude reviews whose card was deleted.

List reviews

GET https://qualiteam.ai/api/v1/projects/{project_id}/reviews

Saved review decisions, comments and overrides. Reviews can survive a deleted evaluation with evaluation_id: null; API reads never attach them to replacement cards. Manager filters exclude reviews whose card was deleted.

Required permissions: evaluations.read.

Pagination and filters.

Required permissions: evaluations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

evaluation_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Match a linked evaluation card ID.

approvedqueryNo Any of: (boolean; null)
anyOf variant: boolean
anyOf variant: null

Filter on effective approval. Approval is independent of publication.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/reviews' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/reviews",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_ReviewSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get review

GET https://qualiteam.ai/api/v1/projects/{project_id}/reviews/{resource_id}

Saved review decisions, comments and overrides. Reviews can survive a deleted evaluation with evaluation_id: null; API reads never attach them to replacement cards. Manager filters exclude reviews whose card was deleted.

Required permissions: evaluations.read.

Required permissions: evaluations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/reviews/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/reviews/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

ReviewDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Attribute results

Extracted conversation attributes, including effective review overrides and original model values. Category history remains available after a category is deleted.

List attribute results

GET https://qualiteam.ai/api/v1/projects/{project_id}/attribute-results

Extracted conversation attributes, including effective review overrides and original model values. Category history remains available after a category is deleted.

Required permissions: evaluations.read.

Pagination and filters.

Required permissions: evaluations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

attribute_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Match an attribute definition ID.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/attribute-results' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/attribute-results",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_AttributeResultSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get attribute result

GET https://qualiteam.ai/api/v1/projects/{project_id}/attribute-results/{resource_id}

Extracted conversation attributes, including effective review overrides and original model values. Category history remains available after a category is deleted.

Required permissions: evaluations.read.

Required permissions: evaluations.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/attribute-results/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/attribute-results/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

AttributeResultDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Appeals

Appeals in every state. Detail adds comments and appealed items. Appeals can survive a deleted card with evaluation_id: null; manager filters exclude these detached appeals.

List appeals

GET https://qualiteam.ai/api/v1/projects/{project_id}/appeals

Appeals in every state. Detail adds comments and appealed items. Appeals can survive a deleted card with evaluation_id: null; manager filters exclude these detached appeals.

Required permissions: appeals.read.

Pagination and filters.

Required permissions: appeals.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

evaluation_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Match a linked evaluation card ID.

statusqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact saved status; evaluations filter on result_status.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/appeals' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/appeals",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_AppealSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get appeal

GET https://qualiteam.ai/api/v1/projects/{project_id}/appeals/{resource_id}

Appeals in every state. Detail adds comments and appealed items. Appeals can survive a deleted card with evaluation_id: null; manager filters exclude these detached appeals.

Required permissions: appeals.read.

Required permissions: appeals.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/appeals/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/appeals/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

AppealDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Alerts

Conversation alerts in all states: active, pending_approval and read. Includes the saved condition and matched-value snapshots. An alert identifies neither a responsible agent nor an evaluation card. Full evaluations need evaluations.read.

List alerts

GET https://qualiteam.ai/api/v1/projects/{project_id}/alerts

Conversation alerts in all states: active, pending_approval and read. Includes the saved condition and matched-value snapshots. An alert identifies neither a responsible agent nor an evaluation card. Full evaluations need evaluations.read.

Required permissions: alerts.read.

Pagination and filters.

Required permissions: alerts.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

conversation_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match conversation IDs. Repeat the parameter for multiple values, up to 100.

manager_idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match agent IDs, up to 100. Messages use their author; evaluations, reviews and appeals use card attribution; other conversation resources use conversation attribution. Detached reviews and appeals have unknown attribution and do not match.

alert_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Match an alert definition ID.

statusqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Exact saved status; evaluations filter on result_status.

updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
triggered_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on triggered_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
triggered_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on triggered_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/alerts' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/alerts",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_AlertSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get alert

GET https://qualiteam.ai/api/v1/projects/{project_id}/alerts/{resource_id}

Conversation alerts in all states: active, pending_approval and read. Includes the saved condition and matched-value snapshots. An alert identifies neither a responsible agent nor an evaluation card. Full evaluations need evaluations.read.

Required permissions: alerts.read.

Required permissions: alerts.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/alerts/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/alerts/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

AlertSummary
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Alert definitions

Configured alert conditions and severity, including soft-deleted definitions kept in history.

List alert definitions

GET https://qualiteam.ai/api/v1/projects/{project_id}/alert-definitions

Configured alert conditions and severity, including soft-deleted definitions kept in history.

Required permissions: alerts.read.

Pagination and filters.

Required permissions: alerts.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

attribute_idqueryNo Any of: (string; null)
anyOf variant: string
anyOf variant: null

Match an attribute definition ID.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/alert-definitions' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/alert-definitions",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_AlertDefinition_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get alert definition

GET https://qualiteam.ai/api/v1/projects/{project_id}/alert-definitions/{resource_id}

Configured alert conditions and severity, including soft-deleted definitions kept in history.

Required permissions: alerts.read.

Required permissions: alerts.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/alert-definitions/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/alert-definitions/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

AlertDefinition
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Notification rules

Alert and appeal subscriptions: recipients, selected managers (or all managers), event type and trigger conditions. These settings do not describe reporting lines or publication routing.

List notification rules

GET https://qualiteam.ai/api/v1/projects/{project_id}/notification-rules

Alert and appeal subscriptions: recipients, selected managers (or all managers), event type and trigger conditions. These settings do not describe reporting lines or publication routing.

Required permissions: notifications.read.

Pagination and filters.

Required permissions: notifications.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-rules' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-rules",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_NotificationRule_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get notification rule

GET https://qualiteam.ai/api/v1/projects/{project_id}/notification-rules/{resource_id}

Alert and appeal subscriptions: recipients, selected managers (or all managers), event type and trigger conditions. These settings do not describe reporting lines or publication routing.

Required permissions: notifications.read.

Required permissions: notifications.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-rules/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-rules/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

NotificationRule
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Notification recipients

Saved notification recipients and linked user IDs. Email and Telegram handles additionally require contacts.read. A saved recipient is not proof of current project access or channel ownership; check both before using these settings to deliver data yourself.

List notification recipients

GET https://qualiteam.ai/api/v1/projects/{project_id}/notification-recipients

Saved notification recipients and linked user IDs. Email and Telegram handles additionally require contacts.read. A saved recipient is not proof of current project access or channel ownership; check both before using these settings to deliver data yourself.

Required permissions: notifications.read.

Pagination and filters.

Required permissions: notifications.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-recipients' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-recipients",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_NotificationRecipient_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get notification recipient

GET https://qualiteam.ai/api/v1/projects/{project_id}/notification-recipients/{resource_id}

Saved notification recipients and linked user IDs. Email and Telegram handles additionally require contacts.read. A saved recipient is not proof of current project access or channel ownership; check both before using these settings to deliver data yourself.

Required permissions: notifications.read.

Required permissions: notifications.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-recipients/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/notification-recipients/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

NotificationRecipient
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Criteria

Evaluation criteria and score ranges. Detail includes grading instructions.

List criteria

GET https://qualiteam.ai/api/v1/projects/{project_id}/criteria

Evaluation criteria and score ranges. Detail includes grading instructions.

Required permissions: criteria.read.

Pagination and filters.

Required permissions: criteria.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/criteria' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/criteria",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_CriterionSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get criterion

GET https://qualiteam.ai/api/v1/projects/{project_id}/criteria/{resource_id}

Evaluation criteria and score ranges. Detail includes grading instructions.

Required permissions: criteria.read.

Required permissions: criteria.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/criteria/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/criteria/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

CriterionDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Attributes

Attribute definitions, extraction settings and categories.

List attributes

GET https://qualiteam.ai/api/v1/projects/{project_id}/attributes

Attribute definitions, extraction settings and categories.

Required permissions: attributes.read.

Pagination and filters.

Required permissions: attributes.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/attributes' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/attributes",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_AttributeSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get attribute

GET https://qualiteam.ai/api/v1/projects/{project_id}/attributes/{resource_id}

Attribute definitions, extraction settings and categories.

Required permissions: attributes.read.

Required permissions: attributes.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/attributes/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/attributes/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

AttributeDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Evaluation tags

Project evaluation tags, including their visibility and assignment settings.

List evaluation tags

GET https://qualiteam.ai/api/v1/projects/{project_id}/evaluation-tags

Project evaluation tags, including their visibility and assignment settings.

Required permissions: evaluation_tags.read.

Pagination and filters.

Required permissions: evaluation_tags.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluation-tags' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluation-tags",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_EvaluationTag_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get evaluation tag

GET https://qualiteam.ai/api/v1/projects/{project_id}/evaluation-tags/{resource_id}

Project evaluation tags, including their visibility and assignment settings.

Required permissions: evaluation_tags.read.

Required permissions: evaluation_tags.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluation-tags/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/evaluation-tags/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

EvaluationTag
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Flows

Expected conversation flows. Detail includes steps and instructions. Lists support only limit and cursor. Ambiguous legacy project prefixes return 409.

List flows

GET https://qualiteam.ai/api/v1/projects/{project_id}/flows

Expected conversation flows. Detail includes steps and instructions. Lists support only limit and cursor. Ambiguous legacy project prefixes return 409.

Required permissions: flows.read.

Pagination and filters.

Required permissions: flows.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/flows' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/flows",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_FlowSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get flow

GET https://qualiteam.ai/api/v1/projects/{project_id}/flows/{resource_id}

Expected conversation flows. Detail includes steps and instructions. Lists support only limit and cursor. Ambiguous legacy project prefixes return 409.

Required permissions: flows.read.

Required permissions: flows.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/flows/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/flows/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

FlowDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Rules

Project instructions, their enabled state and the evaluation outputs they apply to.

List rules

GET https://qualiteam.ai/api/v1/projects/{project_id}/rules

Project instructions, their enabled state and the evaluation outputs they apply to.

Required permissions: rules.read.

Pagination and filters.

Required permissions: rules.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/rules' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/rules",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_RuleSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get rule

GET https://qualiteam.ai/api/v1/projects/{project_id}/rules/{resource_id}

Project instructions, their enabled state and the evaluation outputs they apply to.

Required permissions: rules.read.

Required permissions: rules.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/rules/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/rules/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

RuleDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Knowledge base

Reference documents. Detail includes extracted text, not the original binary file.

List knowledge base

GET https://qualiteam.ai/api/v1/projects/{project_id}/knowledge-base

Reference documents. Detail includes extracted text, not the original binary file.

Required permissions: knowledge_base.read.

Pagination and filters.

Required permissions: knowledge_base.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

limitqueryNo integer

default: 50

minimum: 1

maximum: 100

Maximum page size: 1–100, default 50. No total count is calculated.

cursorqueryNo Any of: (string; null)
anyOf variant: string

maxLength: 4096

anyOf variant: null

Opaque next_cursor from the previous page. Keep the same project, resource and filters. Continue until next_cursor is null, even if a page is empty. You may change limit.

idsqueryNo array · items: string

maxItems: 100

Item schema: string

Match resource IDs. Repeat the parameter for multiple values, up to 100.

created_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
created_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on created_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_fromqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Inclusive lower bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"
updated_toqueryNo Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

Exclusive upper bound on updated_at. ISO 8601 with Z or an offset.

"2026-10-01T00:00:00Z"

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/knowledge-base' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/knowledge-base",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

Page_KnowledgeSummary_
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Get knowledge-base document

GET https://qualiteam.ai/api/v1/projects/{project_id}/knowledge-base/{resource_id}

Reference documents. Detail includes extracted text, not the original binary file.

Required permissions: knowledge_base.read.

Required permissions: knowledge_base.read.

Parameters

NameLocationRequiredSchema and description
project_idpathYes string

ID of a project granted to this integration. Get it from GET /projects.

resource_idpathYes string

Resource ID from this project's list endpoint.

curl example

curl --fail-with-body --get 'https://qualiteam.ai/api/v1/projects/PROJECT_ID/knowledge-base/RESOURCE_ID' \
  -H "Authorization: Bearer $QUALITEAM_API_KEY"

Python example

import os
import requests

response = requests.get(
    "https://qualiteam.ai/api/v1/projects/PROJECT_ID/knowledge-base/RESOURCE_ID",
    headers={"Authorization": f"Bearer {os.environ['QUALITEAM_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())

Responses

200

Successful Response

application/json

KnowledgeDetail
400

Invalid cursor, unsupported filter or missing message conversation IDs.

application/json

ApiErrorResponse
{
  "error": {
    "code": 400,
    "message": "Invalid cursor, unsupported filter or missing message conversation IDs."
  }
}
401

Missing, invalid, retired or revoked API key.

application/json

ApiErrorResponse
{
  "error": {
    "code": 401,
    "message": "Missing, invalid, retired or revoked API key."
  }
}
403

Project is granted, but a required permission is missing.

application/json

ApiErrorResponse
{
  "error": {
    "code": 403,
    "message": "Project is granted, but a required permission is missing."
  }
}
404

Project or resource is absent or outside this integration's grants.

application/json

ApiErrorResponse
{
  "error": {
    "code": 404,
    "message": "Project or resource is absent or outside this integration's grants."
  }
}
405

Method is not supported. This API accepts GET requests only.

application/json

ApiErrorResponse
{
  "error": {
    "code": 405,
    "message": "Method is not supported. This API accepts GET requests only."
  }
}
409

Legacy flow storage has an ambiguous project prefix; contact support.

application/json

ApiErrorResponse
{
  "error": {
    "code": 409,
    "message": "Legacy flow storage has an ambiguous project prefix; contact support."
  }
}
422

Invalid parameter type, range or unknown parameter.

application/json

ApiErrorResponse
{
  "error": {
    "code": 422,
    "message": "Invalid parameter type, range or unknown parameter."
  }
}
429

Integration or company rate limit. Wait the Retry-After seconds before retrying.

Response headers
Retry-After
integer

Seconds to wait before retrying.

application/json

ApiErrorResponse
{
  "error": {
    "code": 429,
    "message": "Integration or company rate limit. Wait the Retry-After seconds before retrying."
  }
}
500

Unexpected server error.

application/json

ApiErrorResponse
{
  "error": {
    "code": 500,
    "message": "Unexpected server error."
  }
}
503

Database is busy; retry with bounded backoff.

application/json

ApiErrorResponse
{
  "error": {
    "code": 503,
    "message": "Database is busy; retry with bounded backoff."
  }
}

Response schemas

Actor

object
id — required
string
name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

AlertDefinition

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
severity — required
string
is_active — required
boolean
deleted_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
activation_behavior — required
string
target_kind — required
string
operator — required
string
attribute_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
category_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
criterion_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
threshold_numeric — required
Any of: (number; null)
anyOf variant: number
anyOf variant: null

AlertNotificationData-Input

object
type — required
string

const: alert_fired

conversations — required
array · items: NotificationConversation

AlertNotificationData-Output

object
type — required
string

const: alert_fired

conversations — required
array · items: NotificationConversation

AlertSummary

object
id — required
string
project_id — required
string
conversation_id — required
string
alert_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
status — required
string
alert_name_snapshot — required
string
severity_snapshot — required
string
target_kind_snapshot — required
string
target_name_snapshot — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
target_attribute_id_snapshot — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
target_criterion_id_snapshot — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
condition_summary_snapshot — required
string
matched_value_summary_snapshot — required
string
triggered_at — required
string · format: date-time

When the alert originally matched. Activation and read changes use updated_at.

updated_at — required
string · format: date-time
read_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
read_by — required
Any of: (Actor; null)
anyOf variant: null

ApiError

object
code — required
integer
message — required
string

Human-readable explanation. Wording varies with the failure; handle errors by HTTP status code.

ApiErrorResponse

object
error — required
ApiError

AppealComment

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
author — required
Any of: (Actor; null)
anyOf variant: null
content — required
string

AppealCreatedNotificationData

object
type — required
string

const: appeal_created

conversation_id — required
string
evaluation_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
appeal_id — required
string
agent_name — required
string
manager_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
item_count — required
integer

AppealDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
conversation_id — required
string
evaluation_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
status — required
string
started_by — required
Any of: (Actor; null)
anyOf variant: null
linked_reviewer — required
Any of: (Actor; null)
anyOf variant: null
closed_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
reopened_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
items — required
array · items: AppealItem-Output

AppealItem-Input

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
criteria_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
criterion_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_general — required
boolean
agent_proposed_score — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
accepted_score — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
qc_decision — required
string
mistake_attribution — required
string
decided_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
decided_by — required
Any of: (Actor; null)
anyOf variant: null
comments — required
array · items: AppealComment

AppealItem-Output

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
criteria_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
criterion_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_general — required
boolean
agent_proposed_score — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
accepted_score — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
qc_decision — required
string
mistake_attribution — required
string
decided_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
decided_by — required
Any of: (Actor; null)
anyOf variant: null
comments — required
array · items: AppealComment

AppealResolvedNotificationData

object
type — required
string

const: appeal_resolved

conversation_id — required
string
evaluation_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
appeal_id — required
string
agent_name — required
string
manager_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
outcome — required
string
accepted_count — required
integer
rejected_count — required
integer
closed_by_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

AppealSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
conversation_id — required
string
evaluation_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
status — required
string
started_by — required
Any of: (Actor; null)
anyOf variant: null
linked_reviewer — required
Any of: (Actor; null)
anyOf variant: null
closed_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
reopened_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

AttributeDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
attribute_type — required
string
is_active — required
boolean
deleted_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
order — required
integer
show_seconds — required
boolean
allow_new_categories — required
boolean
allow_no_options_match — required
boolean
allow_multiple_categories — required
boolean
max_selected_categories — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
run_after_evaluation — required
boolean
context_lookback_mode — required
string
context_lookback_minutes — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
question — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
categories — required
array · items: Category

AttributeResultDetail

object
id — required
string
conversation_id — required
string
attribute_id — required
string
attribute_name — required
string
attribute_type — required
string
numeric_value — required
Any of: (number; null)
anyOf variant: number
anyOf variant: null
model_numeric_value — required
Any of: (number; null)

Original extracted numeric value, before review overrides.

anyOf variant: number
anyOf variant: null
timezone_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
timezone_offset — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
model_timezone_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
model_timezone_offset — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
categories — required
array · items: CategoryReference
model_categories — required
array · items: CategoryReference

Original model category set, before review overrides.

extracted_at — required
string · format: date-time
explanation — required
string
message_references — required
Any of: (object; null)
anyOf variant: object
Additional properties: string
anyOf variant: null

AttributeResultSummary

object
id — required
string
conversation_id — required
string
attribute_id — required
string
attribute_name — required
string
attribute_type — required
string
numeric_value — required
Any of: (number; null)
anyOf variant: number
anyOf variant: null
model_numeric_value — required
Any of: (number; null)

Original extracted numeric value, before review overrides.

anyOf variant: number
anyOf variant: null
timezone_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
timezone_offset — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
model_timezone_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
model_timezone_offset — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
categories — required
array · items: CategoryReference
model_categories — required
array · items: CategoryReference

Original model category set, before review overrides.

extracted_at — required
string · format: date-time

AttributeReview

object
numeric_value — required
Any of: (number; null)
anyOf variant: number
anyOf variant: null
category_ids — required
Any of: (array · items: string; null)
anyOf variant: array · items: string
Item schema: string
anyOf variant: null
timezone_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
timezone_offset — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
timezone_name_set — required
boolean
timezone_offset_set — required
boolean

AttributeSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
attribute_type — required
string
is_active — required
boolean
deleted_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
order — required
integer
show_seconds — required
boolean
allow_new_categories — required
boolean
allow_no_options_match — required
boolean
allow_multiple_categories — required
boolean
max_selected_categories — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
run_after_evaluation — required
boolean
context_lookback_mode — required
string
context_lookback_minutes — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null

Category

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
attribute_id — required
string
name — required
string
description — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
status — required
string
is_active — required
boolean
is_no_options_match — required
boolean
deleted_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

CategoryReference

object
id — required
string
name — required
string
status — required
string
is_no_options_match — required
boolean
deleted_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

ConversationDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
source_id — required
string

External provider ID. Included in the resource's read permission.

state — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
loaded_from — required
Any of: (string · format: date-time; null)

Beginning of the saved conversation coverage window.

anyOf variant: string · format: date-time
anyOf variant: null
loaded_to — required
Any of: (string · format: date-time; null)

End of the saved conversation coverage window.

anyOf variant: string · format: date-time
anyOf variant: null
reporting_date — required
Any of: (string · format: date; null)

Reporting date in the project's timezone, based on the last in-window message or the coverage window end.

anyOf variant: string · format: date
anyOf variant: null
reporting_timezone — required
string

Project timezone used to interpret reporting dates.

attributed_manager_ids — required
array · items: string
Item schema: string
chat_tags — required
array · items: string

Current source-chat tags; separate from evaluation_tag_ids. Empty if unavailable.

Item schema: string
app_url — required
string

Link to Qualiteam. Opening it requires a signed-in user with access to this project.

evaluation_ids — optional
Any of: (array · items: string; null)
anyOf variant: array · items: string
Item schema: string
anyOf variant: null
alert_ids — optional
Any of: (array · items: string; null)
anyOf variant: array · items: string
Item schema: string
anyOf variant: null
evaluation_tag_ids — optional
Any of: (array · items: string; null)
anyOf variant: array · items: string
Item schema: string
anyOf variant: null

ConversationSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
source_id — required
string

External provider ID. Included in the resource's read permission.

state — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
loaded_from — required
Any of: (string · format: date-time; null)

Beginning of the saved conversation coverage window.

anyOf variant: string · format: date-time
anyOf variant: null
loaded_to — required
Any of: (string · format: date-time; null)

End of the saved conversation coverage window.

anyOf variant: string · format: date-time
anyOf variant: null
reporting_date — required
Any of: (string · format: date; null)

Reporting date in the project's timezone, based on the last in-window message or the coverage window end.

anyOf variant: string · format: date
anyOf variant: null
reporting_timezone — required
string

Project timezone used to interpret reporting dates.

attributed_manager_ids — required
array · items: string
Item schema: string
chat_tags — required
array · items: string

Current source-chat tags; separate from evaluation_tag_ids. Empty if unavailable.

Item schema: string
app_url — required
string

Link to Qualiteam. Opening it requires a signed-in user with access to this project.

CriterionDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
max_value — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
minimum_value — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
is_active — required
boolean
order — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
context_lookback_mode — required
string
context_lookback_minutes — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
instruction — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

CriterionResult

object
id — required
string
criterion_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
criterion_key — required
string
criterion_name_snapshot — required
string
criterion_order_snapshot — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
score — required
integer
model_score — required
integer

Original immutable model score, before review overrides.

min_score — required
integer
max_score — required
integer
explanation — required
string
message_references — required
Any of: (object; null)
anyOf variant: object
Additional properties: string
anyOf variant: null

CriterionReview

object
score_override — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
comment — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

CriterionSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
max_value — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
minimum_value — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
is_active — required
boolean
order — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
context_lookback_mode — required
string
context_lookback_minutes — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null

EvaluationDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
conversation_id — required
string
topic — required
string
result_status — required
string
criteria_scoring_mode — required
string
addition_score_direction — required
string

Current project display setting. Changes score colors, never stored values.

total_score — required
integer
total_min_score — required
integer
total_max_score — required
integer
evaluated_at — required
string · format: date-time

When this evaluation was produced; distinct from publication and conversation coverage.

attributed_manager_ids — required
array · items: string
Item schema: string
published_to_agents — required
boolean
published_at — required
Any of: (string · format: date-time; null)

When this evaluation was published to agents.

anyOf variant: string · format: date-time
anyOf variant: null
approved — required
boolean
reviewed_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
approved_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
app_url — required
string

Link to Qualiteam. Opening it requires a signed-in user with access to this project.

llm_general_comment — required
string
original_llm_general_comment — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
criteria_results — required
array · items: CriterionResult
published_by — required
Any of: (Actor; null)
anyOf variant: null
reviewed_by — required
Any of: (Actor; null)
anyOf variant: null
approved_by — required
Any of: (Actor; null)
anyOf variant: null
review_id — required
Any of: (string; null)

Linked review ID, if ownership of the evaluation card is known.

anyOf variant: string
anyOf variant: null

EvaluationSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
conversation_id — required
string
topic — required
string
result_status — required
string
criteria_scoring_mode — required
string
addition_score_direction — required
string

Current project display setting. Changes score colors, never stored values.

total_score — required
integer
total_min_score — required
integer
total_max_score — required
integer
evaluated_at — required
string · format: date-time

When this evaluation was produced; distinct from publication and conversation coverage.

attributed_manager_ids — required
array · items: string
Item schema: string
published_to_agents — required
boolean
published_at — required
Any of: (string · format: date-time; null)

When this evaluation was published to agents.

anyOf variant: string · format: date-time
anyOf variant: null
approved — required
boolean
reviewed_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
approved_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
app_url — required
string

Link to Qualiteam. Opening it requires a signed-in user with access to this project.

EvaluationTag

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
is_active — required
boolean
visible_to_agents — required
boolean
assignable_by_agents — required
boolean
assignable_by_qc_managers — required
boolean
order — required
integer
deleted_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null

FlowDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
description — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_active — required
boolean
steps — required
array · items: FlowStep

FlowStep

object
name — required
string
instruction — required
string
step_type — required
string
order — required
integer
classes — required
Any of: (array · items: string; null)
anyOf variant: array · items: string
Item schema: string
anyOf variant: null
parent_node — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

FlowSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
description — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_active — required
boolean

KnowledgeDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
extracted_text — required
string

KnowledgeSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string

ManagerDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
source_id — required
string

External provider ID. Included in the resource's read permission.

source_type — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_evaluated — required
boolean
tags — required
array · items: string
Item schema: string
email — optional
Any of: (string; null)

Null unless contacts.read is granted and an email is stored.

anyOf variant: string
anyOf variant: null
evaluation_instruction — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
evaluation_language — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

ManagerSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
source_id — required
string

External provider ID. Included in the resource's read permission.

source_type — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_evaluated — required
boolean
tags — required
array · items: string
Item schema: string
email — optional
Any of: (string; null)

Null unless contacts.read is granted and an email is stored.

anyOf variant: string
anyOf variant: null

MessageSummary

object
id — required
string
conversation_id — required
string
source_id — required
string

External provider ID. Included in the resource's read permission.

author_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
author_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
author_type — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
manager_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
content — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
is_internal_note — required
boolean

Whether this is a staff-only note in the source system.

created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
in_evaluation_window — required
boolean

Whether this message's timestamp belongs to the conversation's evaluation window.

is_reply — required
boolean
reply — required
Any of: (ReplyContext; null)

Stored quoted-message context. It is not an additional message or evaluation activity.

anyOf variant: null
is_forwarded — required
boolean
forwarded_from_author_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

NotificationAlert

object
id — required
string
name — required
string

NotificationCondition

object
min_severity — optional
Any of: (string; null)
anyOf variant: string
anyOf variant: null
alert_ids — optional
Any of: (array · items: string; null)
anyOf variant: array · items: string
Item schema: string
anyOf variant: null

NotificationConversation

object
conversation_id — required
string
topic — required
string
chat_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
manager_names — required
array · items: string
Item schema: string
alerts — required
array · items: NotificationAlert

NotificationConversationRef

object
conversation_id — required
string
manager_ids — required
array · items: string

Saved attribution from permitted cards; references managers[].id, not alert responsibility.

Item schema: string
chat_tags — required
array · items: string

Source-chat tags saved at creation and subject to recipient access. Empty when absent, hidden or not captured.

Item schema: string

NotificationDetail

object
id — required
string
project_id — required
string
event_type — required
NotificationEventType
created_at — required
string · format: date-time
recipient — required
NotificationRecipientIdentity
managers — required
array · items: NotificationManager
title — required
string
conversations — required
array · items: NotificationConversationRef

All related conversations, for every event type. Event-specific details remain in data.

text — required
string
links — required
array · items: NotificationLink
data — required
Exactly one of: (AlertNotificationData-Output; AppealCreatedNotificationData; AppealResolvedNotificationData; PublishedNotificationData)

Discriminator: type

NotificationEventType

string

enum: ["alert_fired","appeal_created","appeal_resolved","agent_conversations_published"]

NotificationFeedPage

object
data — required
array · items: NotificationDetail
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null
resume_cursor — required
string

NotificationManager

object
id — required
string
name — required
Any of: (string; null)

Current agent display name at read time; unlike tags, this field is not a creation-time snapshot.

anyOf variant: string
anyOf variant: null
tags — required
array · items: string

Agent tags saved when this notification was created. Empty for older snapshots.

Item schema: string

NotificationRecipient

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
source_user_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
email — optional
Any of: (string; null)

Null unless contacts.read is granted and an email is stored.

anyOf variant: string
anyOf variant: null
telegram_handle — optional
Any of: (string; null)

Null unless contacts.read is granted and a handle is stored. A handle does not verify the current owner or a delivery destination.

anyOf variant: string
anyOf variant: null

NotificationRecipientIdentity

object
id — required
string
kind — required
string

enum: ["recipient","agent"]

name — required
string
user_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
email — required
Any of: (string; null)

Null unless contacts.read is granted and an email is stored.

anyOf variant: string
anyOf variant: null
telegram_handle — required
Any of: (string; null)

Null unless contacts.read is granted and a handle is stored. A handle does not verify the current owner or a delivery destination.

anyOf variant: string
anyOf variant: null

NotificationRule

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
event_type — required
string
all_managers — required
boolean
manager_ids — required
array · items: string
Item schema: string
recipient_ids — required
array · items: string
Item schema: string
condition — required
Any of: (NotificationCondition; null)
anyOf variant: null

Page_AlertDefinition_

object
data — required
array · items: AlertDefinition
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_AlertSummary_

object
data — required
array · items: AlertSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_AppealSummary_

object
data — required
array · items: AppealSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_AttributeResultSummary_

object
data — required
array · items: AttributeResultSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_AttributeSummary_

object
data — required
array · items: AttributeSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_ConversationSummary_

object
data — required
array · items: ConversationSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_CriterionSummary_

object
data — required
array · items: CriterionSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_EvaluationSummary_

object
data — required
array · items: EvaluationSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_EvaluationTag_

object
data — required
array · items: EvaluationTag
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_FlowSummary_

object
data — required
array · items: FlowSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_KnowledgeSummary_

object
data — required
array · items: KnowledgeSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_ManagerSummary_

object
data — required
array · items: ManagerSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_MessageSummary_

object
data — required
array · items: MessageSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_NotificationRecipient_

object
data — required
array · items: NotificationRecipient
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_NotificationRule_

object
data — required
array · items: NotificationRule
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_ProjectSummary_

object
data — required
array · items: ProjectSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_ReviewSummary_

object
data — required
array · items: ReviewSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

Page_RuleSummary_

object
data — required
array · items: RuleSummary
next_cursor — required
Any of: (string; null)

Pass as cursor for the next page. Null means the scan is complete. An empty data array can still have a next cursor when filtering by managers.

anyOf variant: string
anyOf variant: null

ProjectDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
name — required
string
slug — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
reporting_timezone — required
string

Project timezone used to interpret reporting dates.

criteria_scoring_mode — required
string
addition_score_direction — required
string

Current project display setting. Changes score colors, never stored values.

subtraction_min_score — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
subtraction_max_score — required
integer
language — required
string
app_url — required
string

Link to Qualiteam. Opening it requires a signed-in user with access to this project.

description — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
per_agent_evaluation_enabled — required
boolean

ProjectSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
name — required
string
slug — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
reporting_timezone — required
string

Project timezone used to interpret reporting dates.

criteria_scoring_mode — required
string
addition_score_direction — required
string

Current project display setting. Changes score colors, never stored values.

subtraction_min_score — required
Any of: (integer; null)
anyOf variant: integer
anyOf variant: null
subtraction_max_score — required
integer
language — required
string
app_url — required
string

Link to Qualiteam. Opening it requires a signed-in user with access to this project.

PublishedNotificationData

object
type — required
string

const: agent_conversations_published

agent_name — required
string
conversation_count — required
integer
conversation_ids — required
array · items: string
Item schema: string
evaluation_ids — required
array · items: string
Item schema: string

ReplyContext

object
author_name — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
author_type — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
content — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null

ReviewDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
conversation_id — required
string
evaluation_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
approved — required
boolean
reviewed_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
approved_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
reviewed_by — required
Any of: (Actor; null)
anyOf variant: null
approved_by — required
Any of: (Actor; null)
anyOf variant: null
general_comment — required
string
criteria_reviews — required
object
Additional properties: CriterionReview
attribute_reviews — required
object
Additional properties: AttributeReview

ReviewSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
conversation_id — required
string
evaluation_id — required
Any of: (string; null)
anyOf variant: string
anyOf variant: null
approved — required
boolean
reviewed_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
approved_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
reviewed_by — required
Any of: (Actor; null)
anyOf variant: null
approved_by — required
Any of: (Actor; null)
anyOf variant: null

RuleDetail

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
is_active — required
boolean
order — required
integer
targets — required
array · items: string
Item schema: string
instruction — required
string

RuleSummary

object
id — required
string
created_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
updated_at — required
Any of: (string · format: date-time; null)
anyOf variant: string · format: date-time
anyOf variant: null
project_id — required
string
name — required
string
is_active — required
boolean
order — required
integer
targets — required
array · items: string
Item schema: string

NotificationSummary

object
id — required
string
project_id — required
string
event_type — required
NotificationEventType
created_at — required
string · format: date-time
recipient — required
NotificationRecipientIdentity
managers — required
array · items: NotificationManager
title — required
string