# AGENTS Source: https://docs.getbluejay.ai/AGENTS # AGENTS.md This file provides guidance to coding agents working in this repository. ## Docs content * The Integrations pages (`integrations/`) are the only place that lists the integrations and connection types. They change often, so other pages link to the first Integrations page, [Connect Your Agent](/integrations/overview), instead of naming them. A page can still name the providers that one feature supports, for example which platforms can pull a workflow. The API reference can also list connection types with their request fields, as Add Agent does, because API users need the field names. * Headings are sentence case. Page titles in frontmatter are Title Case, because the sidebar shows them. * Capitalize product names: Bluejay AI, Bluejay as Code, Digital Human, Knowledge Base, Red Teaming, Metrics Lab, Self-Improve, and simulation type names. Generic nouns stay lowercase in running text: agent, simulation, custom metric, issue, alert, dashboard, conversation, trace, webhook, integration. * App UI labels are bold and keep the app's exact capitalization. * The first paragraph tells the reader what the page is for, clearly enough to decide in a second whether they are in the right place. That makes it short, such as "Use an alert with a [metric](/monitor/metrics) to catch failures on your production conversations." Leave mechanism and tips for the section where the reader needs them. * The page header already shows the frontmatter `description`, so the first paragraph must not repeat it. Leave out lines about the page itself, such as "Open a section when you need it." * Do not explain a button or field whose label already says what it does, such as "Click **Reset to default** to go back to the standard text." Clicks belong in the docs only as steps of a longer workflow, or when they carry something the screen does not show, such as a limit, a default, or a consequence. * Leave out anything the reader sees on the screen: what a page shows, which section lists what, what opens when you click, where a transcript starts, where else a field can be set. Write only what the screen does not tell them: which action to take for their goal, and behavior they would not expect, such as "Bluejay never changes the status for you, so a **Resolved** issue that happens again stays **Resolved**." * In tables, wrap a long identifier (12+ characters with `_`, `/`, or a dot between letters) in `` from `snippets/code.jsx` instead of backticks, so it breaks only at those separators. Write values that contain `<` or `>` as `{"MISSING__INTEGRATION"}`. * A page `description` is a few words on what the page is for, such as "Master your tests with Digital Humans." * A page's overview video or demo goes right after the intro, before the first heading, so the page does not open with a wall of text. Media that shows one step stays in that step. * Screenshots are in `images/`. An engineer who changes a pictured screen updates its screenshot in the same change. Capture from a test org, crop to the relevant area, and show no customer or internal names. * A step never only sets a visible field, such as "Set **Number of calls** from 1 to 100." Keep setup to a few steps. Inside a step, add a bullet for a field only when it tells the reader something the label does not, such as a limit, a non-obvious effect, or a consequence. Never write a list that restates field labels, such as "**Agents**: the agents it applies to." ## PR conventions PR title: `[ENG-(ticket #)] (fix if it's a fix) (title)`. PR body is four sections, 2-3 sentences each: * Background: what exists today and what prompted the change. * Why: how this is a customer need. * What: summary of the change. * Notable: what a reviewer would otherwise miss. # CLAUDE Source: https://docs.getbluejay.ai/CLAUDE @AGENTS.md # SSO and User Provisioning Source: https://docs.getbluejay.ai/administration/sso-and-provisioning Sign in with SSO and sync your team with SCIM SSO and SCIM are available to enterprise organizations, and an organization admin sets them up under **Settings → Security → Organization**. They work with Okta, Microsoft Entra ID, OneLogin, and any other SAML 2.0 and SCIM 2.0 identity provider (IdP). ![The Organization tab of the Security settings, with SSO turned on and the SCIM section below it](https://mintcdn.com/bluejay/eKcFBkjZX47pI8Ss/images/security-organization.png?fit=max\&auto=format\&n=eKcFBkjZX47pI8Ss\&q=85\&s=77678818dcfc39262a232a368a498818) ## Single sign-on (SAML) **1. Create a SAML app in your IdP** Create a SAML 2.0 application named Bluejay with these values: | Field | Value | | - | - | | Single sign-on URL (ACS URL) | `https://auth.getbluejay.ai/auth/v1/sso/saml/acs` | | Audience URI (SP Entity ID) | `https://auth.getbluejay.ai/auth/v1/sso/saml/metadata` | | Name ID format | `EmailAddress` | | Application username | Email | **2. Assign people** Assign the app to everyone who should have Bluejay access. **3. Turn on SSO in Bluejay** In **Settings → Security → Organization → Single Sign-On (SSO)**, paste your IdP's metadata URL (or the metadata XML) and the email domains that should use SSO. ![The Single Sign-On (SSO) settings with the toggle on, a SAML metadata URL, and example.com as the email domain](https://mintcdn.com/bluejay/eKcFBkjZX47pI8Ss/images/sso-settings.png?fit=max\&auto=format\&n=eKcFBkjZX47pI8Ss\&q=85\&s=86f4dc53408e723c726d348e3598c8e8) **4. Sign in** Your team clicks **Continue with SSO** on [app.getbluejay.ai](https://app.getbluejay.ai) and enters their work email, or opens the Bluejay tile in your IdP. > [!NOTE] > > Once SSO is on, signing up with a password on those domains sends people to your IdP instead. Password and Google accounts that already exist keep working until you remove them. SSO signs people in; it does not decide who belongs to your organization. Before someone's first SSO sign-in, make sure they are already a member or have a pending invite. Invite people from **Settings → Overview**, or let your IdP do it with SCIM below. A person's first SSO sign-in creates a new Bluejay account for them in your organization. If they also had a password or Google account, remove the old one in **Settings → Overview** once SSO works for them. ## User provisioning (SCIM) With SCIM, assigning someone to the Bluejay app in your IdP gives them access, and removing them takes it away. Nobody has to invite or remove people by hand. Turn on SSO first. **1. Generate a token in Bluejay** In **Settings → Security → Organization → User provisioning (SCIM)**, click **Generate token**. Copy the base URL and the token. The token is shown once. ![The User provisioning (SCIM) settings showing the SCIM base URL and a Generate token button before any token exists](https://mintcdn.com/bluejay/eKcFBkjZX47pI8Ss/images/scim-token.png?fit=max\&auto=format\&n=eKcFBkjZX47pI8Ss\&q=85\&s=2cfb7f661ae86d63280c931422ffa2f4) | Setting | Value | | - | - | | SCIM base URL | `https://api.getbluejay.ai/v1/scim` | | Authentication | Bearer token: `Authorization: Bearer `. Sending the token alone in `Authorization` also works. | **2. Connect your IdP** On the Bluejay app in your IdP, turn on SCIM provisioning. Enter the base URL and the token, set the unique identifier to `userName` (email), and test the connection. **3. Choose what syncs** Turn on **Create users**, **Update user attributes**, and **Deactivate users**. **4. Assign people** Assign people, or groups of people, to the Bluejay app. ### What happens | In your IdP | In Bluejay | | - | - | | Assign a person | They can sign in with SSO right away. No invite email is sent. | | Change their name | Their name updates in Bluejay. | | Unassign or deactivate them | They lose access to your organization on their next request: they are signed out and their API keys in your organization are revoked. Their access to other organizations is unaffected. | | Assign them again | They can sign in again. Their work stays in your organization. | ### Details * Everyone provisioned joins as a **Member**. Change roles in **Settings → Overview**. * Only emails on your organization's SSO domains can be provisioned. * Groups are not synced as Bluejay roles or workspaces. Assigning a group to the app provisions each person in it. * **Regenerate token** replaces the token. The old one stops working right away, so update your IdP. **Revoke** stops syncing, and people who already have access keep it. ### Supported endpoints Bluejay implements SCIM 2.0 users: `GET`, `POST`, `PUT`, `PATCH`, and `DELETE` on `/Users`, with `userName eq` and `externalId eq` filters, plus `/ServiceProviderConfig`, `/Schemas`, and `/ResourceTypes`. Paths are relative to the base URL, so users live at `https://api.getbluejay.ai/v1/scim/Users`. SCIM uses its own token, not a Bluejay API key. Full request and response details are in the [API reference](/api-reference/endpoint/list-scim-users). # Workspaces Source: https://docs.getbluejay.ai/administration/workspaces Give each team its own space in one organization Use a workspace for each team that should see only its own work. ![The Workspaces settings page listing four workspaces with their members, usage limits, and usage this period](https://mintcdn.com/bluejay/eKcFBkjZX47pI8Ss/images/workspaces-list.png?fit=max\&auto=format\&n=eKcFBkjZX47pI8Ss\&q=85\&s=61ca211e30aedb02f8301f371549c95c) ## Create a workspace You need to be an organization admin to create, edit, or delete workspaces. **1. Create it** In **Settings → Workspaces**, click **Create workspace**. The **Usage limit** is optional. Once the workspace spends this many credits in a billing period, new runs in it are refused until the next period or until you raise the limit. ![The Create workspace dialog with a name, an optional description, and a usage limit in credits](https://mintcdn.com/bluejay/eKcFBkjZX47pI8Ss/images/workspace-create.png?fit=max\&auto=format\&n=eKcFBkjZX47pI8Ss\&q=85\&s=b1d8dc2cfd9adcd4532954d0ab2fb376) **2. Add people** In **Settings → Workspaces**, click the workspace to open its page. Click **Invite members**, or **Manage members** to add people already in your organization. ![A workspace page with the Invite members button and a Members list with a Manage members button](https://mintcdn.com/bluejay/eKcFBkjZX47pI8Ss/images/workspace-add-people.png?fit=max\&auto=format\&n=eKcFBkjZX47pI8Ss\&q=85\&s=aa7829481fd9f8031be950ce53f0f4e8) To switch workspaces, choose **Switch workspace...** in the account menu. ## Who sees what * **Admins** see and manage every workspace without being added to it. * **Members** see only the workspaces they were added to. A member who belongs to no workspace works in the Default workspace. Anything you create lands in the workspace you are in. The **Overview**, **Workspaces**, and **Billing** settings cover the whole organization, and only admins see them. ## Auto-delete An admin can set rules on a workspace's page that move its agents to Trash after a number of days with no simulation runs, no observability, or both. Pick agents under **Leave these agents out** to keep them. A deleted agent's always-on numbers are torn down too. An agent with a simulation still running waits until it finishes. Changing the rules, or restoring an agent from Trash, starts the clock over. ## The Default workspace Every organization has a Default workspace, and it cannot be deleted. When you delete another workspace, its agents, simulations, and other work move into Default, and so do its members. The delete is blocked if an agent in the workspace shares an external agent ID with an agent in Default, so change or remove one of each pair first. API keys scoped to the deleted workspace stop working. Its integration keys are deleted too, unless Default has none of its own. ## What a workspace holds Belongs to a workspace: * Agents, simulations, Digital Humans, custom metrics, dashboards, and issues * Alerts and uptime monitors. An alert watches only its own workspace's agents, even when it applies to all agents. * Webhooks. A webhook fires only for agents in its own workspace. * Phone numbers. Buy numbers in the workspace whose Digital Humans use them. * Integration keys, including the PagerDuty, Better Stack, and incident.io keys that alerts use * API keys with **Workspace** scope Shared across the organization: * People, roles, and billing * The Slack connection * API keys with **Organization** scope A new workspace uses the Default workspace's integration keys until either one saves a change; after that each keeps its own. Agents you sync from a voice platform land in the workspace you sync from. ## API keys When you create a key on the **API Keys** page, its **Scope** decides where it reaches: * **Workspace**: reads and writes only in the workspace you pick. * **Organization**: acts as you and reaches every workspace you can open. Anything it creates lands in the workspace you last switched to in the app. A key stops reaching a workspace when its creator loses access to that workspace. ## Limits * You cannot move an agent, phone number, or anything else to another workspace. Create it again in the workspace you want, or buy new numbers there. * Workspace names must be unique within the organization. ## Related * [SSO and User Provisioning](/administration/sso-and-provisioning) * [Make your first request](/api-reference/introduction#make-your-first-request) * [Alerts](/monitor/alerts) * [Webhooks](/api-reference/webhooks) * [Digital Human numbers](/test/simulations/digital-humans#connection) # Azure Pipelines Source: https://docs.getbluejay.ai/api-reference/azure-pipelines Fail an Azure Pipelines build when your agent's pass rate drops. Run your agent's simulations in Azure Pipelines and block pull requests that drop below your minimum pass rate. To gate pull requests without changing a pipeline, connect Azure DevOps in the app instead: see the Azure DevOps tab of [CI/CD Integration](/api-reference/ci-cd). To run Bluejay as a pipeline step, use the Bluejay extension if your organization can install Marketplace extensions, or the plain YAML step, which needs nothing installed. ## Prerequisites 1. A Bluejay API key, from the [Developers page](https://app.getbluejay.ai/developers). 2. An agent connected to your assistant. 3. A simulation on that agent, with the Digital Humans you want to run. ## Use the Bluejay extension **1. Install the extension** Search for **Bluejay** in the [Visual Studio Marketplace](https://marketplace.visualstudio.com/search?term=bluejay\&target=AzureDevOps) and install it in your organization. Installing needs a Project Collection Administrator. Anyone else can request it, and the administrator gets an email to approve it. **2. Add a Bluejay service connection** In your project, go to **Project settings > Service connections > New service connection > Bluejay**. Paste your API key, name the connection `Bluejay`, and save. The first pipeline run that uses the connection stops with *"This pipeline needs permission to access a resource"*. Select **Permit** once. To skip this, grant the pipeline access in the connection's **Security** settings. **3. Add the task to your pipeline** Add the task to `azure-pipelines.yml`. In the classic editor, **Simulation** lists the simulations the key can see. ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} trigger: branches: include: [main] pr: branches: include: [main] pool: vmImage: ubuntu-latest steps: - task: BluejaySimulation@1 inputs: bluejayConnection: Bluejay simulationId: '12345' minScore: '80' ``` **4. Require it on pull requests** For Azure Repos, go to **Repos > Branches**, open the branch policies of `main`, and add the pipeline under **Build validation** as **Required**. A pull request then can't complete until the simulation passes. For GitHub repos built in Azure Pipelines, the `pr:` trigger runs it, and you make it required with GitHub branch protection. After the run, the pipeline's **Extensions** tab shows the pass rate and a link to the run in Bluejay. ## Use a plain YAML step This step does the same with `curl` and `jq`, which Microsoft-hosted Ubuntu agents already have. Add your API key as a secret pipeline variable named `BLUEJAY_API_KEY`. Secret variables are not passed to scripts automatically, so the step maps it with `env:`. ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} trigger: branches: include: [main] pr: branches: include: [main] pool: vmImage: ubuntu-latest variables: BLUEJAY_SIMULATION_ID: '12345' BLUEJAY_MIN_SCORE: '80' steps: - bash: | set -euo pipefail awk -v m="$BLUEJAY_MIN_SCORE" 'BEGIN { exit !(m ~ /^[0-9]+(\.[0-9]+)?$/ && m <= 100) }' || { echo "##vso[task.logissue type=error]BLUEJAY_MIN_SCORE must be a number from 0 to 100"; exit 1; } api="${BLUEJAY_API_URL:-https://api.getbluejay.ai}" api="${api%/}/v1" ci=$(jq -n '{ provider: "azure_pipelines", repository: env.BUILD_REPOSITORY_NAME, commit_sha: (env.SYSTEM_PULLREQUEST_SOURCECOMMITID // env.BUILD_SOURCEVERSION), branch: (env.SYSTEM_PULLREQUEST_SOURCEBRANCH // env.BUILD_SOURCEBRANCH), pull_request: (env.SYSTEM_PULLREQUEST_PULLREQUESTNUMBER // env.SYSTEM_PULLREQUEST_PULLREQUESTID), pipeline_run_url: "\(env.SYSTEM_COLLECTIONURI | rtrimstr("/"))/\(env.SYSTEM_TEAMPROJECT | @uri)/_build/results?buildId=\(env.BUILD_BUILDID)" } | with_entries(select(.value != null))') queued=$(curl -sS --max-time 60 --fail-with-body -X POST "$api/queue-simulation-run" \ -H "X-API-Key: $BLUEJAY_API_KEY" -H "Content-Type: application/json" \ -d "$(jq -n --arg id "$BLUEJAY_SIMULATION_ID" --argjson ci "$ci" '{simulation_id: $id, ci: $ci}')") run_id=$(jq -r .simulation_run_id <<<"$queued") echo "Queued simulation run $run_id $(jq -r '.run_url // empty' <<<"$queued")" deadline=$((SECONDS + ${BLUEJAY_TIMEOUT_SECONDS:-1500})) while true; do left=$((deadline - SECONDS)); [ "$left" -lt 1 ] && left=1; [ "$left" -gt 60 ] && left=60 run=$(curl -sS --max-time "$left" --fail-with-body "${api%/v1}/v2/retrieve-simulation-results/$run_id?limit=1" -H "X-API-Key: $BLUEJAY_API_KEY" | jq .simulation_run) status=$(jq -r '(.status // "") | ascii_downcase' <<<"$run") passed=$(jq -r '.tests_passed // 0' <<<"$run") total=$(jq -r '.total_tests // 0' <<<"$run") rate=$(jq -r 'if .success_rate != null then .success_rate elif .total_tests > 0 then 100 * (.tests_passed // 0) / .total_tests else 0 end' <<<"$run") echo "Status $status, passed $passed/$total ($rate%)" case "$status" in completed|success|failed|cancelled|error) break ;; esac if [ "$SECONDS" -ge "$deadline" ]; then echo "##vso[task.logissue type=error]Timed out waiting for run $run_id"; exit 1; fi sleep "${BLUEJAY_POLL_SECONDS:-10}" done echo "##vso[task.setvariable variable=bluejayReportUrl]$(jq -r '.run_url // empty' <<<"$queued")" case "$status" in completed|success) ;; *) echo "##vso[task.logissue type=error]Run $run_id ended with status $status"; exit 1 ;; esac if awk -v r="$rate" -v m="$BLUEJAY_MIN_SCORE" 'BEGIN { exit !(r < m) }'; then echo "##vso[task.logissue type=error]Pass rate $rate% is below the minimum of $BLUEJAY_MIN_SCORE%" exit 1 fi echo "Pass rate $rate% meets the minimum of $BLUEJAY_MIN_SCORE%" displayName: Run Bluejay simulation env: BLUEJAY_API_KEY: $(BLUEJAY_API_KEY) ``` It fails the step when the run does not complete, when the pass rate is below `BLUEJAY_MIN_SCORE`, or after 25 minutes. Set `BLUEJAY_TIMEOUT_SECONDS` to change the wait. ## Inputs | Input | Required | Default | Description | | - | - | - | - | | `bluejayConnection` | One of these two | None | Bluejay service connection. | | `apiKey` | One of these two | None | API key, as a secret variable such as `$(BLUEJAY_API_KEY)`. Used only without a service connection. | | `simulationId` | Yes | None | ID of the simulation to run. | | `minScore` | No | `80` | Required pass rate (0–100). | | `waitForResults` | No | `true` | If `false`, queue the run and pass without waiting. | | `agentVersionId` | No | None | Agent version UUID to use for this run. `promptId` also works. | | `knowledgeBaseId` | No | None | Knowledge Base override for this run. | | `digitalHumanIds` | No | None | Comma-separated Digital Human IDs. Defaults to all of them. | | `phoneNumber` | No | None | Phone number to use for this run. | | `sipUri` | No | None | SIP URI to use for this run. | | `pollIntervalSeconds` | No | `10` | Polling frequency in seconds. | | `timeoutSeconds` | No | `1500` | Maximum wait in seconds (25 minutes). | ## Outputs The task sets these output variables. Give the step a `name:` to read them in later steps, for example `$(bluejay.score)`. | Output | Description | | - | - | | `simulationRunId` | ID of the queued simulation run. | | `finalStatus` | Final run status, for example `COMPLETED`. | | `score` | Pass rate of the run: `success_rate` from the v2 results endpoint, the share of graded tests that passed. | | `reportUrl` | Link to the run in Bluejay. | ## Pipeline details on the run Both options send the pipeline's repository, commit, branch, pull request and a link back to the pipeline run with the queued run. The **CI/CD** tab in **Settings > Integrations** lists the latest runs started from a pipeline, with their pass rate and both links. ## Related * [GitHub Actions](/api-reference/ci-cd) * [Queue Simulation Run](/api-reference/endpoint/queue-simulation-run) * [Retrieve Simulation Results](/api-reference/endpoint/retrieve-simulation-results-v2) # API Cheat Sheet Source: https://docs.getbluejay.ai/api-reference/cheat-sheet Every endpoint at a glance. For the base URL and authentication, see the [API introduction](/api-reference/introduction). ## Test ### Simulations | Method | Path | Description | | - | - | - | | POST | [`/v1/create-simulation`](/api-reference/endpoint/create-simulation) | Creates a simulation for an agent and returns `simulation_id`. | | POST | [`/v1/simulation/{simulation_id}/add-digital-humans`](/api-reference/endpoint/add-digital-humans-to-simulation) | Links existing Digital Humans to a simulation. | | POST | [`/v1/simulation/{simulation_id}/remove-digital-humans`](/api-reference/endpoint/remove-digital-humans-from-simulation) | Unlinks Digital Humans from a simulation. | | PUT | [`/v1/simulation/{simulation_id}`](/api-reference/endpoint/update-simulation) | Updates a simulation. | | GET | [`/v1/simulation/{simulation_id}`](/api-reference/endpoint/get-simulation) | Returns one simulation by `simulation_id`. | | GET | [`/v1/get-all-simulations`](/api-reference/endpoint/get-all-simulations) | Returns all simulations in your organization, for all agents. | | GET | [`/v1/get-simulations-by-agent/{agent_id}`](/api-reference/endpoint/get-simulations-by-agent) | Returns the simulations for one agent. | | DELETE | [`/v1/simulation/{simulation_id}`](/api-reference/endpoint/delete-simulation) | Deletes a simulation by `simulation_id`. | | POST | [`/v1/queue-http-text-simulation-run`](/api-reference/endpoint/queue-http-text-simulation-run) | Starts a text run for an HTTP agent and returns `simulation_run_id` and `simulation_result_ids`. | | POST | [`/v1/send-http-text-message`](/api-reference/endpoint/send-http-text-message) | Sends one agent turn into a running HTTP text simulation. | ### Simulation runs | Method | Path | Description | | - | - | - | | POST | [`/v1/queue-simulation-run`](/api-reference/endpoint/queue-simulation-run) | Queues a run of a simulation and returns the run ID. | | POST | [`/v1/queue-sms-simulation-run`](/api-reference/endpoint/queue-sms-simulation-run) | Queues an SMS run of a simulation. | | GET | [`/v1/get-simulation-runs/{simulation_id}`](/api-reference/endpoint/get-simulation-runs) | Returns the runs of a simulation. | | POST | [`/v1/update-simulation-result`](/api-reference/endpoint/update-simulation-result) | Adds tool calls, events, tags, metadata, and trace IDs to a simulation result. | | GET | [`/v1/retrieve-simulation-results/{simulation_run_id}`](/api-reference/endpoint/retrieve-simulation-results) | Returns a simulation run and one page of its results, oldest first. | | GET | [`/v1/retrieve-simulation-result/{test_result_id}`](/api-reference/endpoint/retrieve-simulation-result) | Returns one simulation result and its custom metric results. | | POST | [`/v1/end-conversations`](/api-reference/endpoint/end-conversations) | Ends running conversations. | ### Digital Humans | Method | Path | Description | | - | - | - | | POST | [`/v1/create-digital-human`](/api-reference/endpoint/create-digital-human) | Creates one Digital Human. | | POST | [`/v1/create-digital-humans`](/api-reference/endpoint/create-digital-humans) | Creates many Digital Humans in one request. | | POST | [`/v1/generate-digital-humans`](/api-reference/endpoint/generate-digital-humans) | Generates Digital Humans for an agent and links them to the simulation. | | PUT | [`/v1/update-digital-human/{digital_human_id}`](/api-reference/endpoint/update-digital-human) | Updates a Digital Human. | | GET | [`/v1/digital-human/{digital_human_id}`](/api-reference/endpoint/get-digital-human) | Returns one Digital Human by `digital_human_id`. | | GET | [`/v1/digital-humans-by-simulation/{simulation_id}`](/api-reference/endpoint/get-digital-humans-by-simulation) | Returns the Digital Humans linked to a simulation. | | GET | [`/v1/digital-humans`](/api-reference/endpoint/get-all-digital-humans) | Returns the Digital Humans in your organization, newest first. | | DELETE | [`/v1/digital-human/{digital_human_id}`](/api-reference/endpoint/delete-digital-human) | Deletes a Digital Human by `digital_human_id`. | | POST | [`/v1/generate-objectives`](/api-reference/endpoint/generate-objectives) | Generates objectives from the intent of a Digital Human and saves them on the Digital Human. | | POST | [`/v1/generate-intent-summary`](/api-reference/endpoint/generate-intent-summary) | Writes `intent_summary` on a Digital Human. | ### Personalities | Method | Path | Description | | - | - | - | | GET | [`/v1/personalities`](/api-reference/endpoint/list-personalities) | Returns the personality library of your organization. | | POST | [`/v1/personalities`](/api-reference/endpoint/create-personalities) | Creates one or more personalities. | | PATCH | [`/v1/personalities/{personality_id}`](/api-reference/endpoint/update-personality) | Updates a personality. | | DELETE | [`/v1/personalities/{personality_id}`](/api-reference/endpoint/delete-personality) | Deletes a personality and removes it from every simulation that selects it. | | GET | [`/v1/simulations/{simulation_id}/personalities`](/api-reference/endpoint/get-simulation-personalities) | Returns the personalities that a simulation runs with. | | PUT | [`/v1/simulations/{simulation_id}/personalities`](/api-reference/endpoint/set-simulation-personalities) | Replaces the personality selection of a simulation. | | POST | [`/v1/create-customer-persona`](/api-reference/endpoint/create-customer-persona) | Creates a customer persona with `name`, `description`, and `goal`. | | PUT | [`/v1/update-customer-persona/{persona_id}`](/api-reference/endpoint/update-customer-persona) | Updates a customer persona. | | GET | [`/v1/customer-persona/{persona_id}`](/api-reference/endpoint/get-customer-persona) | Returns one customer persona by `persona_id`. | | GET | [`/v1/customer-personas-by-agent/{agent_id}`](/api-reference/endpoint/get-customer-persona-by-agent) | Returns the customer personas for one agent. | | DELETE | [`/v1/customer-persona/{persona_id}`](/api-reference/endpoint/delete-customer-persona) | Deletes a customer persona and its agent links. | ### Communities | Method | Path | Description | | - | - | - | | POST | [`/v1/create-community`](/api-reference/endpoint/create-community) | Creates a community. | | PUT | [`/v1/update-community/{community_id}`](/api-reference/endpoint/update-community) | Updates a community. | | PUT | [`/v1/add-to-community/{community_id}`](/api-reference/endpoint/add-to-community) | Adds Digital Humans to a community. | | GET | [`/v1/community/{community_id}`](/api-reference/endpoint/get-community) | Returns one community by `community_id`. | | GET | [`/v1/communities`](/api-reference/endpoint/get-communities) | Returns the communities in your organization. | | DELETE | [`/v1/community/{community_id}`](/api-reference/endpoint/delete-community) | Deletes a community. | ### Custom background noises | Method | Path | Description | | - | - | - | | GET | [`/v1/custom-background-noises`](/api-reference/endpoint/list-custom-background-noises) | Returns the custom background noises in your organization, oldest first. | | POST | [`/v1/custom-background-noises/upload-url`](/api-reference/endpoint/create-custom-background-noise-upload-url) | Returns `upload_url` and `storage_path`. | | POST | [`/v1/custom-background-noises`](/api-reference/endpoint/create-custom-background-noise) | Adds an uploaded file to the background noise library. | | PATCH | [`/v1/custom-background-noises/{noise_id}`](/api-reference/endpoint/update-custom-background-noise) | Renames a custom background noise. | | DELETE | [`/v1/custom-background-noises/{noise_id}`](/api-reference/endpoint/delete-custom-background-noise) | Removes a custom background noise from the library. | ### Scenario Builder | Method | Path | Description | | - | - | - | | POST | [`/v1/scenario`](/api-reference/endpoint/create-scenario) | Creates a scenario. | | GET | [`/v1/scenario`](/api-reference/endpoint/list-scenarios) | Returns `workflows` and `total_count`. | | GET | [`/v1/scenario/{workflow_id}`](/api-reference/endpoint/get-scenario) | Returns one scenario with its full `definition`. | | PUT | [`/v1/scenario/{workflow_id}`](/api-reference/endpoint/update-scenario) | Updates a scenario. | | DELETE | [`/v1/scenario/{workflow_id}`](/api-reference/endpoint/delete-scenario) | Deletes a scenario. | ### Schedules | Method | Path | Description | | - | - | - | | POST | [`/v1/create-schedule`](/api-reference/endpoint/create-schedule) | Creates a schedule for a simulation. | | GET | [`/v1/schedules`](/api-reference/endpoint/list-schedules) | Returns the schedules for the agents you can see. | | GET | [`/v1/schedule/{schedule_id}`](/api-reference/endpoint/get-schedule) | Returns one schedule by `schedule_id`. | | PUT | [`/v1/update-schedule/{schedule_id}`](/api-reference/endpoint/update-schedule) | Updates a schedule and returns the updated schedule. | | DELETE | [`/v1/delete-schedule/{schedule_id}`](/api-reference/endpoint/delete-schedule) | Deletes a schedule. | ### Red Teaming | Method | Path | Description | | - | - | - | | POST | [`/v1/red-team-simulations`](/api-reference/endpoint/start-red-team-simulation) | Starts a red team test against an agent. | | GET | [`/v1/red-team-simulations`](/api-reference/endpoint/list-red-team-simulations) | Returns the red team tests for the agents you can see. | | GET | [`/v1/red-team-simulations/{test_id}`](/api-reference/endpoint/get-red-team-simulation) | Returns one red team test by `test_id`. | | POST | [`/v1/red-team-simulations/{test_id}/stop`](/api-reference/endpoint/stop-red-team-simulation) | Stops a red team test. | | GET | [`/v1/red-team-simulations/entitlements`](/api-reference/endpoint/get-red-team-entitlements) | Returns `custom_matrix`. | ### Metrics | Method | Path | Description | | - | - | - | | POST | [`/v1/create-metric`](/api-reference/endpoint/create-custom-metric) | Creates one custom metric. | | POST | [`/v1/create-metrics`](/api-reference/endpoint/create-custom-metrics) | Creates many custom metrics in one request. | | PUT | [`/v1/update-metric/{metric_id}`](/api-reference/endpoint/update-custom-metric) | Updates one custom metric. | | PUT | [`/v1/update-metrics`](/api-reference/endpoint/update-custom-metrics) | Applies the same `updates` to each metric in `metric_ids`. | | GET | [`/v1/metric/{metric_id}`](/api-reference/endpoint/get-custom-metric) | Returns one custom metric. | | GET | [`/v1/metrics`](/api-reference/endpoint/get-custom-metrics) | Returns custom metrics. | | GET | [`/v1/custom-metrics-by-agent/{agent_id}`](/api-reference/endpoint/get-custom-metrics-by-agent) | Deprecated. This endpoint is deprecated. | | DELETE | [`/v1/metric/{metric_id}`](/api-reference/endpoint/delete-custom-metric) | Deletes one custom metric. | | POST | [`/v1/delete-metrics`](/api-reference/endpoint/delete-custom-metrics) | Deletes many custom metrics. | ## Monitor ### Logs | Method | Path | Description | | - | - | - | | POST | [`/v1/evaluate`](/api-reference/endpoint/evaluate) | Sends one production conversation for evaluation. | | POST | [`/v1/re-evaluate/{conversation_id}`](/api-reference/endpoint/re-evaluate) | Creates a new evaluation for a conversation. | | GET | [`/v1/observability/conversations`](/api-reference/endpoint/list-conversations) | Returns production conversations, newest first. | | GET | [`/v1/observability/conversations/{conversation_id}`](/api-reference/endpoint/get-conversation) | Returns one production conversation with its transcript and metric results. | | GET | [`/v1/retrieve-call-log/{call_id}`](/api-reference/endpoint/retrieve-call-log) | Returns one call log and its evaluations. | | GET | [`/v1/retrieve-call-logs/{agent_id}`](/api-reference/endpoint/retrieve-call-logs) | Deprecated. This endpoint is deprecated. | | DELETE | [`/v1/call-log/{call_id}`](/api-reference/endpoint/delete-call-log) | Deletes a call log. | | POST | [`/v1/translate-transcript`](/api-reference/endpoint/translate-transcript) | Translates a transcript. | ### Uptime monitors | Method | Path | Description | | - | - | - | | GET | [`/v1/uptime/monitors`](/api-reference/endpoint/list-uptime-monitors) | Returns the uptime monitors in your organization. | | GET | [`/v1/uptime/monitors/{monitor_id}`](/api-reference/endpoint/get-uptime-monitor) | Returns one uptime monitor and its recent checks. | | POST | [`/v1/uptime/monitors`](/api-reference/endpoint/create-uptime-monitor) | Creates an uptime monitor and the simulation and schedule that run it. | | PUT | [`/v1/uptime/monitors/{monitor_id}`](/api-reference/endpoint/update-uptime-monitor) | Updates an uptime monitor. | | DELETE | [`/v1/uptime/monitors/{monitor_id}`](/api-reference/endpoint/delete-uptime-monitor) | Deletes an uptime monitor and stops its scheduled checks. | | GET | [`/v1/uptime/monitors/{monitor_id}/series`](/api-reference/endpoint/get-uptime-monitor-series) | Returns outcome counts, uptime percentage, and p50, p90, p95, and p99 latency per time bucket. | | POST | [`/v1/uptime/monitors/{monitor_id}/incidents/resolve`](/api-reference/endpoint/resolve-uptime-incidents) | Resolves every unresolved DOWN check of a monitor. | | POST | [`/v1/uptime/monitors/{monitor_id}/checks/{check_id}/resolve`](/api-reference/endpoint/resolve-uptime-check) | Resolves one DOWN check. | | POST | [`/v1/uptime/monitors/{monitor_id}/checks/{check_id}/unresolve`](/api-reference/endpoint/unresolve-uptime-check) | Opens a resolved DOWN check again. | | GET | [`/v1/uptime/monitors/{monitor_id}/checks/{check_id}/transcript`](/api-reference/endpoint/get-uptime-check-transcript) | Returns the transcript of one check. | ### Issues | Method | Path | Description | | - | - | - | | GET | [`/v1/observability/issues`](/api-reference/endpoint/list-issues) | An issue is a problem that Bluejay finds across your calls. | | GET | [`/v1/observability/issues/{issue_id}`](/api-reference/endpoint/get-issue) | Returns one issue. | | PUT | [`/v1/observability/issues/{issue_id}`](/api-reference/endpoint/update-issue) | Updates an issue. | ### Alerts | Method | Path | Description | | - | - | - | | POST | [`/v1/create-alert`](/api-reference/endpoint/create-alert) | Creates an alert. | | PUT | [`/v1/update-alert/{alert_id}`](/api-reference/endpoint/update-alert) | Updates an alert. | | GET | [`/v1/alerts`](/api-reference/endpoint/get-alerts) | Returns the alerts in your organization. | | GET | [`/v1/alerts/{alert_id}/results`](/api-reference/endpoint/get-alert-results) | Returns the times an alert fired, newest first. | | DELETE | [`/v1/alert/{alert_id}`](/api-reference/endpoint/delete-alert) | Deletes an alert and its agent links. | ### Dashboards | Method | Path | Description | | - | - | - | | GET | [`/v1/dashboards`](/api-reference/endpoint/list-dashboards) | Returns dashboards, newest first. | | POST | [`/v1/dashboards`](/api-reference/endpoint/create-dashboard) | Creates an empty dashboard. | | GET | [`/v1/dashboards/{dashboard_id}`](/api-reference/endpoint/get-dashboard) | Returns a dashboard and its widgets, in layout order. | | PUT | [`/v1/dashboards/{dashboard_id}`](/api-reference/endpoint/update-dashboard) | Updates the name or description of a dashboard. | | PUT | [`/v1/dashboards/{dashboard_id}/layout`](/api-reference/endpoint/update-dashboard-layout) | Sets the position and size of widgets on a dashboard. | | POST | [`/v1/dashboards/{dashboard_id}/duplicate`](/api-reference/endpoint/duplicate-dashboard) | Creates a copy named ` (Copy)` with a copy of each widget in the same layout. | | DELETE | [`/v1/dashboards/{dashboard_id}`](/api-reference/endpoint/delete-dashboard) | Deletes a dashboard, its widgets, and their metrics. | | GET | [`/v1/widgets`](/api-reference/endpoint/list-widgets) | Returns widgets with their metrics, newest first. | | POST | [`/v1/widgets`](/api-reference/endpoint/create-widget) | Creates a widget on a dashboard. | | GET | [`/v1/widgets/{widget_id}`](/api-reference/endpoint/get-widget) | Returns one widget and its metrics. | | PUT | [`/v1/widgets/{widget_id}`](/api-reference/endpoint/update-widget) | Replaces the full configuration and metrics of a widget. | | POST | [`/v1/widgets/{widget_id}/duplicate`](/api-reference/endpoint/duplicate-widget) | Creates a copy named `Copy of ` on the dashboard in `dashboard_id`. | | DELETE | [`/v1/widgets/{widget_id}`](/api-reference/endpoint/delete-widget) | Deletes a widget and its metrics. | ### Traces | Method | Path | Description | | - | - | - | | GET | [`/v1/traces`](/api-reference/endpoint/list-traces) | Returns recent traces for the conversations you can see. | | POST | [`/v1/traces/{trace_id}`](/api-reference/endpoint/get-trace) | Returns one trace and its spans. | | POST | [`/v1/spans/{trace_id}/{span_id}`](/api-reference/endpoint/get-span) | Returns one span of a trace. | ### Webhooks | Method | Path | Description | | - | - | - | | `WEBHOOK` | [`Your URL`](/api-reference/webhook/events-webhook) | To receive events at your own server, register a webhook URL in the dashboard and subscribe it to the events you want. | ## Improve ### Self-Improve | Method | Path | Description | | - | - | - | | POST | [`/v1/self-improve/runs`](/api-reference/endpoint/start-self-improve-run) | Starts a loop that changes the agent prompt, pushes it to the provider, and runs the simulation to score it. | | GET | [`/v1/self-improve/runs`](/api-reference/endpoint/list-self-improve-runs) | Returns the Self-Improve runs for the agents you can see. | | GET | [`/v1/self-improve/runs/{run_id}`](/api-reference/endpoint/get-self-improve-run) | Returns one Self-Improve run by `run_id`. | | POST | [`/v1/self-improve/runs/{run_id}/stop`](/api-reference/endpoint/stop-self-improve-run) | Requests a stop and returns `STOP_REQUESTED`. | ### Metrics Lab | Method | Path | Description | | - | - | - | | GET | [`/v1/metrics-lab/labs`](/api-reference/endpoint/list-labs) | Returns labs, newest first, with counts. | | POST | [`/v1/metrics-lab/lab`](/api-reference/endpoint/create-lab) | Creates a lab with a set of conversations and custom metrics. | | GET | [`/v1/metrics-lab/lab/{lab_id}`](/api-reference/endpoint/get-lab) | Returns the full lab. | | PUT | [`/v1/metrics-lab/lab/{lab_id}`](/api-reference/endpoint/update-lab) | Updates the name or description of a lab. | | PUT | [`/v1/metrics-lab/lab/{lab_id}/settings`](/api-reference/endpoint/update-lab-settings) | Merges the settings you send into the current lab settings. | | DELETE | [`/v1/metrics-lab/lab/{lab_id}`](/api-reference/endpoint/delete-lab) | Deletes a lab. | | POST | [`/v1/metrics-lab/lab/{lab_id}/metrics`](/api-reference/endpoint/add-metrics-to-lab) | Adds custom metrics to a lab. | | POST | [`/v1/metrics-lab/lab/{lab_id}/conversations`](/api-reference/endpoint/add-conversations-to-lab) | Adds conversations to a lab. | | DELETE | [`/v1/metrics-lab/lab/{lab_id}/conversations`](/api-reference/endpoint/remove-conversations-from-lab) | Removes conversations from a lab. | | POST | [`/v1/metrics-lab/evaluate-conversation`](/api-reference/endpoint/evaluate-lab-conversation) | Queues an evaluation of one conversation with the metrics you send. | | PUT | [`/v1/metrics-lab/lab/{lab_id}/human-evaluation`](/api-reference/endpoint/set-human-evaluation) | Creates or updates the human label for one metric on one conversation. | | POST | [`/v1/metrics-lab/lab/{lab_id}/metric-revisions`](/api-reference/endpoint/create-metric-revision) | Creates a revision of a custom metric in a lab. | ## Configure ### Agents | Method | Path | Description | | - | - | - | | POST | [`/v1/add-agent`](/api-reference/endpoint/add-agent) | Adds an agent. | | POST | [`/v1/update-agent`](/api-reference/endpoint/update-agent) | Updates an agent by `agent_id`. | | PUT | [`/v1/update-agent-by-external-id`](/api-reference/endpoint/update-agent-by-external-id) | Updates an agent by `external_agent_id`, the ID of the agent at your voice provider. | | PUT | [`/v1/folders/move-agent`](/api-reference/endpoint/move-agent-to-folder) | Moves an agent into a folder. | | GET | [`/v1/agents/{agent_id}`](/api-reference/endpoint/get-agent) | Returns one agent by `agent_id`. | | GET | [`/v1/agent-by-external-id/{external_id}`](/api-reference/endpoint/get-agent-by-external-id) | Returns one agent by `external_agent_id`. | | GET | [`/v1/agents/{agent_id}/workflow/summary`](/api-reference/endpoint/get-workflow-summary) | Returns the workflow of one agent as `nodes` and `edges`. | | POST | [`/v1/agents/{agent_id}/workflow/sync`](/api-reference/endpoint/sync-agent-workflow) | Pulls the latest workflow of one agent from its provider. | | GET | [`/v1/get-agents-by-folder/{folder_id}`](/api-reference/endpoint/get-agents-by-folder) | Returns the ID and name of each agent in a folder. | | GET | [`/v1/all-agents`](/api-reference/endpoint/get-all-agents) | Returns all agents in your organization. | | DELETE | [`/v1/agent/{agent_id}`](/api-reference/endpoint/delete-agent) | Deletes an agent by `agent_id`. | #### Agent versions | Method | Path | Description | | - | - | - | | POST | [`/v1/agents/{agent_id}/versions`](/api-reference/endpoint/create-prompt-version) | Creates the next agent version of an agent. | | POST | [`/v1/agents/{agent_id}/versions/promote`](/api-reference/endpoint/promote-prompt) | Moves the `production` label to the latest version, or to the version in `version`. | | GET | [`/v1/agents/{agent_id}/versions`](/api-reference/endpoint/list-prompt-versions) | Returns the agent versions of an agent. | | GET | [`/v1/agents/{agent_id}/versions/{version}`](/api-reference/endpoint/get-prompt-version) | Returns one agent version by number. | | GET | [`/v1/agents/{agent_id}/versions/{prompt_id}`](/api-reference/endpoint/get-prompt-by-id) | Returns one agent version by UUID. | | GET | [`/v1/agents/{agent_id}/prompts`](/api-reference/endpoint/get-prompt-by-label) | Deprecated. This endpoint is deprecated. | | DELETE | [`/v1/agents/{agent_id}/versions/{version}`](/api-reference/endpoint/delete-prompt-version) | Deletes one agent version. | | DELETE | [`/v1/agents/{agent_id}/versions`](/api-reference/endpoint/delete-prompt-version-by-label) | Deletes the version that has the `label` you send. | | DELETE | [`/v1/agents/{agent_id}/versions/{prompt_id}`](/api-reference/endpoint/delete-prompt-by-id) | Deletes one agent version by UUID. | | GET | [`/v1/agents/{agent_id}/versions/{version}/labels`](/api-reference/endpoint/list-prompt-version-labels) | Returns the labels on one agent version. | | POST | [`/v1/agents/{agent_id}/versions/{version}/labels`](/api-reference/endpoint/add-prompt-version-labels) | Adds labels to one agent version. | | DELETE | [`/v1/agents/{agent_id}/versions/{version}/labels`](/api-reference/endpoint/remove-prompt-version-labels) | Removes labels from one agent version. | #### Knowledge Bases | Method | Path | Description | | - | - | - | | POST | [`/v1/knowledge-base`](/api-reference/endpoint/create-knowledge-base) | Creates an empty Knowledge Base. | | GET | [`/v1/knowledge-base`](/api-reference/endpoint/list-knowledge-bases) | Returns the Knowledge Bases in your organization, each with `document_count`. | | GET | [`/v1/knowledge-base/{knowledge_base_id}`](/api-reference/endpoint/get-knowledge-base) | Returns a Knowledge Base and its documents. | | PUT | [`/v1/knowledge-base/{knowledge_base_id}`](/api-reference/endpoint/update-knowledge-base) | Updates a Knowledge Base. | | DELETE | [`/v1/knowledge-base/{knowledge_base_id}`](/api-reference/endpoint/delete-knowledge-base) | Deletes a Knowledge Base and returns 204. | | POST | [`/v1/knowledge-base/{knowledge_base_id}/agents/{agent_id}`](/api-reference/endpoint/attach-agent-to-knowledge-base) | Links an agent to a Knowledge Base. | | DELETE | [`/v1/knowledge-base/{knowledge_base_id}/agents/{agent_id}`](/api-reference/endpoint/detach-agent-from-knowledge-base) | Unlinks an agent from a Knowledge Base and returns 204. | ### Organization | Method | Path | Description | | - | - | - | | POST | [`/v1/agents/{agent_id}/labels`](/api-reference/endpoint/create-label) | Creates a label for an agent. | | GET | [`/v1/agents/{agent_id}/labels`](/api-reference/endpoint/list-labels) | Returns the labels of an agent. | | GET | [`/v1/agents/{agent_id}/labels/{label_id}`](/api-reference/endpoint/get-label-by-id) | Returns one label. | | PUT | [`/v1/agents/{agent_id}/labels/{label_id}`](/api-reference/endpoint/update-label) | Renames a label. | | DELETE | [`/v1/agents/{agent_id}/labels/{label_id}`](/api-reference/endpoint/delete-label) | Deletes a label. | | POST | [`/v1/create-folder`](/api-reference/endpoint/create-folder) | Creates a folder for agents. | | PUT | [`/v1/update-folder/{folder_id}`](/api-reference/endpoint/update-folder) | Renames a folder. | | GET | [`/v1/folder/{folder_id}`](/api-reference/endpoint/get-folder) | Returns one folder. | | GET | [`/v1/all-folders`](/api-reference/endpoint/get-all-folders) | Returns all folders in your organization. | | DELETE | [`/v1/folder/{folder_id}`](/api-reference/endpoint/delete-folder) | Deletes a folder. | | GET | [`/v1/phone-numbers`](/api-reference/endpoint/phone-numbers) | Returns the phone numbers in your organization. | ### Integrations | Method | Path | Description | | - | - | - | | POST | [`/v1/integrations/amelia/sync`](/api-reference/endpoint/sync-amelia-agents) | Imports each Amelia AI agent that the Amelia integration account can see. | | GET | [`/v1/integrations/amelia/agents`](/api-reference/endpoint/list-amelia-agents) | Returns the AI agent names in one Amelia domain. | | GET | [`/v1/integrations/amelia/flows`](/api-reference/endpoint/list-amelia-flows) | Returns the flow names in one Amelia domain. | # CI/CD Integration Source: https://docs.getbluejay.ai/api-reference/ci-cd Fail a build when your agent's score drops. Connect your deployment pipeline to Bluejay simulations. > [tab] GitHub > > ## Set up the GitHub App > > **1. Connect GitHub** > > Go to **Settings > Integrations**, open the **CI/CD** tab, select **GitHub**, click **Connect**, and approve the Bluejay GitHub App on the repositories you want to test. > > **2. Add a trigger** > > Open a simulation, click **CI/CD**, and add a trigger with a repository, an environment name, and a minimum score. The environment name must match the deployment environment your host reports to GitHub, for example `Production`. > > The host must report deployments to GitHub. Vercel, Netlify, Railway and Render do. If yours does not, [use the GitHub Action](#use-the-github-action-instead). > > Each run uses credits. > > ## Production and preview triggers > > A **Production** trigger runs the simulation against the saved agent after a successful production deploy. > > A preview trigger runs against the preview deployment, for that one run only. The saved agent is not changed. Set an endpoint template, and Bluejay fills in the placeholders from the deployment: > > | Placeholder | Value | > | - | - | > | | Full URL of the deployment | > | | Host of the deployment URL | > | | Commit SHA | > | | First 7 characters of the SHA | > | | Pull request number. The run fails to queue if the commit has no pull request | > | | Environment name | > > Examples: > > * WebSocket agent: `wss://{environment_url_host}/ws` > * LiveKit agent: `my-agent-pr-{pr_number}`, used as the LiveKit agent name > > Preview runs work for agents that connect by WebSocket, HTTP webhook, OpenAI chat, OpenAI Realtime, LiveKit or Pipecat. Phone and SIP agents, and agents hosted on builders such as Vapi, Retell and ElevenLabs, only support Production triggers. > > Set a **Preview domain** such as `vercel.app` when the template uses or . It is required for those templates. The host of the rendered URL must end with it. Only `https` and `wss` URLs are allowed, and private addresses are blocked. > > If previews are protected, for example by Vercel Deployment Protection, add a bypass header to the trigger so Bluejay can reach the deployment. > > ## See the result > > Bluejay adds a check to the commit and its pull request. It passes when the score is at least the trigger's minimum score, and links to the run. To block merges on a failing score, make the check required in your branch protection rules. > > ## Use the GitHub Action instead > > Use the Action when your host does not report deployments to GitHub, or when you want the run inside your own workflow. You need a Bluejay [API key](/api-reference/introduction#make-your-first-request), an agent, and a simulation with the Digital Humans you want to run. > > ### Test an existing agent > > All runs go to the same simulation, so you can compare them. > > **1. Add your API key and variables** > > In GitHub, under **Settings > Secrets and variables > Actions**, add your API key as a repository secret named `BLUEJAY_API_KEY`, and add these repository variables: > > | Variable name | Value | Required | > | - | - | - | > | BLUEJAY\_SIMULATION\_ID | Your simulation ID (e.g., `12345`) | Yes | > | BLUEJAY\_MIN\_SCORE | Minimum score (e.g., `80`) | No | > | BLUEJAY\_PROMPT\_ID | Agent version override ID (the action input is `prompt_id`) | No | > | BLUEJAY\_KB\_ID | Knowledge Base override ID | No | > | BLUEJAY\_DIGITAL\_HUMAN\_IDS | Comma-separated Digital Human IDs | No | > > The simulation ID is in the simulation's **General Settings** tab, and each Digital Human ID is on its card in the **Digital Humans** tab. > > **2. Create your workflow** > > Add `.github/workflows/bluejay-tests.yml` to your repo: > > ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > name: Agent Tests > > on: > workflow_dispatch: > inputs: > simulation_id: > description: 'Bluejay Simulation ID to run' > required: false > type: string > min_score: > description: 'Minimum score (0-100)' > required: false > type: string > default: '80' > push: > branches: [main] > pull_request: > types: [opened, synchronize] > > jobs: > run-bluejay-tests: > runs-on: ubuntu-latest > > steps: > - name: Run Bluejay Tests > uses: bluejay-ai-dev/bluejay-github-actions@v1 > with: > api_key: ${{ secrets.BLUEJAY_API_KEY }} > # Required: simulation id (manual input OR repo variable) > simulation_id: ${{ inputs.simulation_id || vars.BLUEJAY_SIMULATION_ID }} > # Optional overrides (omit the ones you do not use) > prompt_id: ${{ vars.BLUEJAY_PROMPT_ID }} > knowledge_base_id: ${{ vars.BLUEJAY_KB_ID }} > digital_human_ids: ${{ vars.BLUEJAY_DIGITAL_HUMAN_IDS }} > # Behavior controls > wait_for_results: 'true' > min_score: ${{ inputs.min_score || vars.BLUEJAY_MIN_SCORE || '80' }} > poll_interval_seconds: '10' > timeout_seconds: '1500' > ``` > > **3. Trigger a simulation** > > Open a pull request. The action runs the simulation on each PR and shows pass or fail in the PR checks. The score is in the job logs. > > ![GitHub Action Check](https://mintcdn.com/bluejay/13QTZFHWYyYMSQI8/images/trigger_github_action.png?fit=max\&auto=format\&n=13QTZFHWYyYMSQI8\&q=85\&s=7fe8d0c5156098b39f9dfb33ed280524) > > ### Test a preview deployment > > Use this option if CI makes a preview deployment for each PR. For each PR, the workflow creates an agent and a simulation, runs the test, and then deletes both. Your Digital Humans are not deleted, because they are your test suite and every PR reuses them. > > The example uses a `WEBSOCKET` agent. Set `PREVIEW_WEBSOCKET_URL` to the URL of the preview deployment. For other connection types, send that type's fields instead. [Add Agent](/api-reference/endpoint/add-agent) lists them. > > For this option, set `BLUEJAY_DIGITAL_HUMAN_IDS`, for example `101,102`, because a new simulation has no Digital Humans and the run fails without them. > > ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > name: Agent Tests (ephemeral) > > on: > pull_request: > types: [opened, synchronize] > > env: > BLUEJAY_API: https://api.getbluejay.ai/v1 > BLUEJAY_API_KEY: ${{ secrets.BLUEJAY_API_KEY }} > PREVIEW_WEBSOCKET_URL: wss://pr-${{ github.event.number }}.preview.example.com/ws > > jobs: > run-bluejay-tests: > runs-on: ubuntu-latest > steps: > - name: Create ephemeral agent > id: agent > run: | > payload=$(jq -n \ > --arg name "ci-pr-${{ github.event.number }}-run-${{ github.run_id }}" \ > --arg ws_url "$PREVIEW_WEBSOCKET_URL" \ > '{ > name: $name, > system_prompt: "Customer support assistant under test", > goals: ["Resolve the customer issue"], > connection_type: "WEBSOCKET", > websocket_url: $ws_url > }') > resp=$(curl -s --fail-with-body -X POST "$BLUEJAY_API/add-agent" \ > -H "X-API-Key: $BLUEJAY_API_KEY" \ > -H "Content-Type: application/json" \ > -d "$payload") > echo "id=$(echo "$resp" | jq -r '.agent_id')" >> "$GITHUB_OUTPUT" > > - name: Create simulation > id: sim > run: | > resp=$(curl -s --fail-with-body -X POST "$BLUEJAY_API/create-simulation" \ > -H "X-API-Key: $BLUEJAY_API_KEY" \ > -H "Content-Type: application/json" \ > -d '{ > "agent_id": "${{ steps.agent.outputs.id }}", > "name": "CI PR #${{ github.event.number }}" > }') > echo "id=$(echo "$resp" | jq -r '.simulation_id')" >> "$GITHUB_OUTPUT" > > - name: Attach Digital Humans > run: | > curl -s --fail-with-body -X POST "$BLUEJAY_API/simulation/${{ steps.sim.outputs.id }}/add-digital-humans" \ > -H "X-API-Key: $BLUEJAY_API_KEY" \ > -H "Content-Type: application/json" \ > -d '{"digital_human_ids": [${{ vars.BLUEJAY_DIGITAL_HUMAN_IDS }}]}' > > - name: Run Bluejay Tests > uses: bluejay-ai-dev/bluejay-github-actions@v1 > with: > api_key: ${{ secrets.BLUEJAY_API_KEY }} > simulation_id: ${{ steps.sim.outputs.id }} > wait_for_results: 'true' > min_score: '80' > > - name: Clean up > if: always() > run: | > status=0 > if [ -n "${{ steps.sim.outputs.id }}" ]; then > curl -s --fail-with-body -X DELETE "$BLUEJAY_API/simulation/${{ steps.sim.outputs.id }}" \ > -H "X-API-Key: $BLUEJAY_API_KEY" || status=1 > fi > if [ -n "${{ steps.agent.outputs.id }}" ]; then > curl -s --fail-with-body -X DELETE "$BLUEJAY_API/agent/${{ steps.agent.outputs.id }}" \ > -H "X-API-Key: $BLUEJAY_API_KEY" || status=1 > fi > exit $status > ``` > > > [!WARNING] > > > > The cleanup step deletes the agent and the simulation, and the run history with them. To keep results, remove the cleanup step or [test an existing agent](#test-an-existing-agent). > > ### Pin to a commit SHA > > Some organizations require every third-party action to be pinned to a full-length commit SHA. If yours does, the workflow fails with *"all actions must be pinned to a full-length commit SHA"*. To find the commit for `v1`, run: > > ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > git ls-remote https://github.com/bluejay-ai-dev/bluejay-github-actions 'refs/tags/v1^{}' > ``` > > Then put the SHA in place of `v1`: > > ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > uses: bluejay-ai-dev/bluejay-github-actions@c28260e8bd21f29e3841c712131a0ae979c7bdd7 # v1 > ``` > > > [!NOTE] > > > > A SHA pin does not follow updates to `v1`. To get fixes, run the command again and update the pin. > > ### Inputs > > | Input | Required | Default | Description | > | - | - | - | - | > | `api_key` | Yes | None | Your Bluejay API key. | > | simulation\_id | Yes | None | ID of the simulation to run. | > | `prompt_id` | No | None | Agent version UUID to use for this run. | > | knowledge\_base\_id | No | None | Override Knowledge Base for this run. | > | digital\_human\_ids | No | None | Comma-separated list of Digital Human IDs. | > | phone\_number | No | None | Phone number to use for this run. | > | `sip_uri` | No | None | SIP URI to use for this run. | > | wait\_for\_results | No | `true` | If `true`, wait for the run to end and fail CI on the score. | > | `min_score` | No | `80` | Minimum score (0-100). | > | poll\_interval\_seconds | No | `10` | Polling frequency in seconds. | > | timeout\_seconds | No | `1500` | Maximum wait in seconds (25 minutes). | > > The step fails if the run does not complete, if the score is below `min_score`, or if `timeout_seconds` passes first. To only queue the run without checking the score, set `wait_for_results` to `false`. > > ### Outputs > > | Output | Description | > | - | - | > | `simulation-run-id` | The ID of the queued simulation run. | > | `final-status` | The final run status from the API, for example `completed`. | > | `score` | Score of the run: `tests_passed / total_tests × 100`. | > > ### Triggers > > To run the tests on a different event, change only the `on:` section. Any [GitHub Actions trigger](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows) works. For example, to run daily at 09:00 UTC: > > ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > on: > schedule: > - cron: '0 9 * * *' > ``` > [tab] GitLab > > ## Set up GitLab > > **1. Connect GitLab** > > Go to **Settings > Integrations**, open the **CI/CD** tab, and select **GitLab**. On gitlab.com, click **Connect** and approve Bluejay with the `api` scope. You return to Bluejay with the account listed. > > For self-managed GitLab, click **Use an access token**. Enter your instance URL, such as `https://gitlab.example.com`, and a personal, group or project access token with the `api` scope and the **Maintainer** role. The instance must be reachable over https from the internet. > > **2. Add a trigger** > > Open a simulation, click **CI/CD**, and add a trigger with a project, an environment name, and a minimum score. The environment name must match the `environment:` name of your deploy job, for example `production`. > > You need the Maintainer or Owner role on the project, because Bluejay adds a webhook to it, with only Deployment events turned on, and GitLab only lets those roles add webhooks. With a lower role, such as Guest or Developer, the project does not show up in Bluejay. > > A run starts when a deploy job with an `environment:` succeeds. If your pipeline does not deploy with GitLab environments, [use the API job](#use-the-api-job-instead). > > Each run uses credits. > > ## Review app triggers > > To cover every review app, set the trigger's environment to `review/*`. It matches any environment that starts with `review/`, such as `review/$CI_COMMIT_REF_SLUG`. The deploy job must set `environment: url:`, since Bluejay calls that URL. > > A review app trigger runs against that deployment and does not change the saved agent. Set an endpoint template, and Bluejay fills it in from the deployment's environment URL. Templates use the same placeholders, preview domain and bypass header as [GitHub preview triggers](#production-and-preview-triggers). In GitLab, is the merge request IID. > > ## See the result in GitLab > > Bluejay adds a commit status named **Bluejay: \ (\)** to the commit, and it shows on the commit's merge request. It passes when the score is at least the trigger's minimum score, and links to the run. To block merges on a failing score, turn on **Pipelines must succeed** under **Settings > Merge requests**. The status runs as a job in the commit's pipeline. > > ## Use the API job instead > > Add a job to `.gitlab-ci.yml` that queues a run through the API, waits for it to finish, and fails when the score is below your minimum. > > **1. Add variables** > > In GitLab, under **Settings > CI/CD > Variables**, add: > > | Variable | Value | Masked | > | - | - | - | > | BLUEJAY\_API\_KEY | Your Bluejay [API key](/api-reference/introduction#make-your-first-request) | Yes | > | BLUEJAY\_SIMULATION\_ID | Your simulation ID | No | > | MIN\_SCORE | Minimum score, 0-100 (e.g., `80`) | No | > > The simulation ID is in the simulation's **General Settings** tab. > > **2. Add the job** > > ```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > bluejay-tests: > stage: .post > image: alpine:3.20 > timeout: 30m > variables: > BLUEJAY_API: https://api.getbluejay.ai/v1 > before_script: > - apk add --no-cache curl jq > script: > - | > set -eu > awk -v m="$MIN_SCORE" 'BEGIN { exit !(m ~ /^[0-9]+(\.[0-9]+)?$/ && m <= 100) }' || { echo "MIN_SCORE must be 0-100"; exit 1; } > body=$(jq -n --arg id "$BLUEJAY_SIMULATION_ID" '{simulation_id: $id, ci: ({provider: "gitlab_ci", repository: env.CI_PROJECT_PATH, commit_sha: env.CI_COMMIT_SHA, branch: (env.CI_COMMIT_BRANCH // env.CI_COMMIT_REF_NAME), pull_request: env.CI_MERGE_REQUEST_IID, pipeline_run_url: env.CI_PIPELINE_URL} | with_entries(select(.value != null)))}') > resp=$(curl -sS --max-time 60 --fail-with-body -X POST "$BLUEJAY_API/queue-simulation-run" \ > -H "X-API-Key: $BLUEJAY_API_KEY" \ > -H "Content-Type: application/json" \ > -d "$body") > run_id=$(echo "$resp" | jq -r '.simulation_run_id') > echo "Queued run $run_id" > > status="" > for _ in $(seq 1 150); do > resp=$(curl -sS --max-time 60 --fail-with-body "${BLUEJAY_API%/v1}/v2/retrieve-simulation-results/$run_id" \ > -H "X-API-Key: $BLUEJAY_API_KEY") > status=$(echo "$resp" | jq -r '.simulation_run.status // ""' | tr 'A-Z' 'a-z') > case "$status" in completed|failed|cancelled|success|error) break ;; esac > sleep 10 > done > > score=$(echo "$resp" | jq -r '.simulation_run | if .success_rate != null then .success_rate elif (.total_tests // 0) > 0 then (.tests_passed // 0) / .total_tests * 100 else 0 end') > echo "Status: $status, score: $score, minimum: $MIN_SCORE" > case "$status" in completed|success) ;; *) echo "Run did not complete"; exit 1 ;; esac > awk -v s="$score" -v m="$MIN_SCORE" 'BEGIN { exit !(s >= m) }' > ``` > > The score is the run's `success_rate` from the v2 results endpoint, the share of graded tests that passed. The job polls every 10 seconds for up to 25 minutes. The `.post` stage runs after every other stage, so the job tests the version your deploy jobs shipped. Add `rules` to run it only on the pipelines you want. Each run uses credits. > [tab] Azure DevOps > > ## Connect Azure DevOps > > **1. Create a personal access token** > > In Azure DevOps, open **User settings > Personal access tokens** and create a token for your organization with these scopes: **Code (Read)**, **Code (Status)**, **Project and Team (Read)** and **Service Hooks (Read & write)**. The token owner needs permission to edit service hook subscriptions in the project. > > **2. Connect** > > Go to **Settings > Developers > Integrations**, open the **CI/CD** tab, select **Azure DevOps**, click **Connect**, and enter your organization and the token. > > **3. Add a trigger** > > Open a simulation, click **CI/CD**, and add a trigger with a repository, a target branch such as `main`, and a minimum score. > > **4. Require it on pull requests** > > Bluejay runs the simulation on every pull request into that branch and posts the score as the `bluejay/simulation` status. It passes when the score is at least the trigger's minimum score. In **Repos > Branches > Branch policies > Status checks**, add that status and set it to required. > > Each run uses credits. To run Bluejay from a pipeline instead, see [Azure Pipelines](/api-reference/azure-pipelines) for the extension and a plain YAML step. ## Related * [Simulation API](/api-reference/endpoint/queue-simulation-run) * [Simulation](/test/simulations/create) * [Simulation Results](/test/simulations/create#read-the-results) * [Bluejay as Code](/bluejay-as-code/overview) # POST /v1/add-agent Source: https://docs.getbluejay.ai/api-reference/endpoint/add-agent POST https://api.getbluejay.ai/v1/add-agent Add an agent. Adds an agent. The response contains `agent_id` and `version`, which is always `1` on create. Store both values.## Fields by connection typeEach `connection_type` reads its own fields from the request. A request without a required field returns `400`.| `connection_type` | Required | Optional | | - | - | - | | `PHONE` `SMS` | None | phone\_number outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template | | `SIP` | None | `sip_uri` sip\_username sip\_password custom\_sip\_headers dynamic\_sip\_webhook\_url outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template | | `WEBSOCKET` | None | websocket\_url websocket\_username websocket\_password | | `LIVEKIT` | None | livekit\_agent\_name livekit\_metadata livekit\_customer\_tool\_topic livekit\_token\_webhook\_url livekit\_token\_webhook\_auth | | `PIPECAT` | None | pipecat\_agent\_name pipecat\_agent\_configuration pipecat\_room\_properties | | HTTP\_WEBHOOK | None | `http_webhook` http\_webhook\_sync\_reply outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template | | ELEVEN\_LABS | eleven\_labs\_agent\_id | None | | `RETELL` | retell\_agent\_id | phone\_number outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template | | `VAPI` | vapi\_assistant\_id | None | | `KORE` | `kore_host` `kore_bot_id` kore\_client\_id kore\_client\_secret | None | | OPENAI\_CHAT | openai\_base\_url | openai\_api\_key openai\_model | | OPENAI\_REALTIME | None | openai\_realtime\_url openai\_realtime\_session openai\_api\_key openai\_model openai\_prompt\_id openai\_prompt\_version | | SIERRA\_VOICE | sierra\_agent\_token | sierra\_release sierra\_agent\_parameters | | AMELIA\_CHAT AMELIA\_VOICE | amelia\_base\_url amelia\_domain\_code | amelia\_flow\_name amelia\_agent\_name | | GOOGLE\_CES\_CHAT GOOGLE\_CES\_VOICE | `ces_app_id` ces\_deployment\_id | None | | GOOGLE\_DFCX\_CHAT GOOGLE\_DFCX\_VOICE | dfcx\_project\_id dfcx\_location dfcx\_agent\_id | None | | BLAND\_PHONE BLAND\_CHAT | bland\_pathway\_id | bland\_call\_settings phone\_number outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template | | BLAND\_VOICE | bland\_pathway\_id bland\_agent\_id | bland\_call\_settings phone\_number outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template | | `EMAIL` | email\_address | email\_reply\_addresses outbound\_trigger\_webhook\_url outbound\_trigger\_payload\_template |Every connection type also reads `provider_request_data`, the agent's variables.An `OPENAI_REALTIME` agent without `openai_realtime_url` connects to OpenAI's own Realtime endpoint. An `EMAIL` agent always gets `mode` `EMAIL`.If you leave out `connection_type`, Bluejay infers it from the fields you send. For example, `vapi_assistant_id` makes a `VAPI` agent. Google CES, Dialogflow CX, Amelia and Bland agents are inferred as voice agents, so send `connection_type` for a chat agent. A request with none of these fields makes a `PHONE` agent.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/add-agent \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "system_prompt": "", "phone_number": "", "goals": [ "" ], "type": "INBOUND", "connection_type": "SMS", "mode": "VOICE", "keyterms": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "external_agent_id": "", "labels": [ "" ], "folder": "", "websocket_url": "", "websocket_username": "", "websocket_password": "", "sip_uri": "", "sip_username": "", "sip_password": "", "custom_sip_headers": { "key": "" }, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "redact_pii": false, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_sync_reply": true, "voice_provider": "", "provider_id": "", "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "email_address": "", "email_reply_addresses": [ "" ], "bland_pathway_id": "", "bland_agent_id": "", "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "bland_call_settings": {}, "provider_request_data": {}, "enable_outbound_call_auto_start": true, "simulations_disabled": false, "workflow": {}, "provider": "CUSTOM" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agent_id": 123, "status": "200", "version": 123, "http_webhook_key": "" } ``` # POST /v1/metrics-lab/lab/{lab_id}/conversations Source: https://docs.getbluejay.ai/api-reference/endpoint/add-conversations-to-lab POST https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/conversations Add conversations to a lab. Adds conversations to a lab.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/conversations \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "lab_id": "", "conversations": [ { "call_id": "", "test_result_id": 123 } ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "added_count": 123, "skipped_count": 123, "added_conversation_ids": [ {} ], "message": "" } ``` # POST /v1/simulation/{simulation_id}/add-digital-humans Source: https://docs.getbluejay.ai/api-reference/endpoint/add-digital-humans-to-simulation POST https://api.getbluejay.ai/v1/simulation/{simulation_id}/add-digital-humans Add Digital Humans to a simulation. Links existing Digital Humans to a simulation. Current links stay.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/simulation/{simulation_id}/add-digital-humans \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "digital_human_ids": [ 123 ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "", "failed_sip_reconcile_ids": [ 123 ] } ``` # POST /v1/metrics-lab/lab/{lab_id}/metrics Source: https://docs.getbluejay.ai/api-reference/endpoint/add-metrics-to-lab POST https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/metrics Add custom metrics to a lab. Adds custom metrics to a lab. If `evaluate_conversations` is true, Bluejay copies existing results and queues evaluations only where a result is missing.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/metrics \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "lab_id": "", "metric_ids": [ "" ], "evaluate_conversations": false }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "added_count": 123, "skipped_count": 123, "added_metric_ids": [ "" ], "evaluation_triggered": false, "evaluation_count": 123, "message": "" } ``` # POST /v1/agents/{agent_id}/versions/{version}/labels Source: https://docs.getbluejay.ai/api-reference/endpoint/add-prompt-version-labels POST https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version}/labels Add labels to an agent version. Adds labels to one agent version.`POST /v1/agents/{agent_id}/prompts/versions/{version}/labels` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version}/labels \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "labels": [ "" ], "override_label": false }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "labels": [ "" ] } ``` # PUT /v1/add-to-community/{community_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/add-to-community PUT https://api.getbluejay.ai/v1/add-to-community/{community_id} Add Digital Humans to a community. Adds Digital Humans to a community. Current members stay.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/add-to-community/{community_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "digital_human_ids": [ 123 ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "title": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "digital_human_ids": [ 123 ] } ``` # POST /v1/knowledge-base/{knowledge_base_id}/agents/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/attach-agent-to-knowledge-base POST https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id}/agents/{agent_id} Attach an agent to a Knowledge Base. Links an agent to a Knowledge Base. A second request for the same pair does not add a duplicate.Rate limit: 60 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `201` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id}/agents/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 201 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "" } ``` # POST /v1/create-alert Source: https://docs.getbluejay.ai/api-reference/endpoint/create-alert POST https://api.getbluejay.ai/v1/create-alert Create an alert. Creates an alert. `source_scope` selects the data: `observability`, `simulation`, or `all`.- For `observability`, `threshold_time_interval` is a window in seconds. The default is 600. `min_events` defaults to 10. - For `simulation`, `threshold_time_interval` is the number of recent completed runs. The default is 1. `min_events` is not used. - `sample_size` evaluates the last N conversations instead of a time window. The minimum is 30. The alert does not fire with fewer than N conversations.Each entry in `notification_channels` has a `type` and a `target`. The `target` depends on the `type`:- `email`: the email address - `slack`: the Slack channel ID - `webhook`: the webhook URL - `pagerduty`: the PagerDuty routing key - `betterstack`: Bluejay ignores `target` and uses the connected API tokenTo connect each channel, see [Alerts](/monitor/alerts#connect-a-channel).## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-alert \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "sample_size": 123, "name": "", "description": "", "is_enabled": true, "entity_type": "standard_metric", "entity_field": "", "operator": "equals", "comparison_value": "", "notification_channels": [ { "type": "", "target": "" } ], "applies_to_all_agents": true, "agent_ids": [ 123 ], "simulation_id": 123, "evaluation_scope": "per_test_result", "aggregation": "none", "threshold_time_interval": 123, "min_events": 123, "min_events_type": "events", "source_scope": "all" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "name": "", "description": "", "is_enabled": true, "organization_id": "", "entity_type": "standard_metric", "entity_field": "", "operator": "equals", "comparison_value": "", "notification_channels": [ null ], "last_triggered_at": "2026-01-01T00:00:00Z", "trigger_count": 123, "created_by": "", "applies_to_all_agents": true, "agents": [ 123 ], "simulation_id": 123, "evaluation_scope": "", "aggregation": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "threshold_time_interval": 123, "min_events": 123, "min_events_type": "events", "in_alert": true, "source_scope": "all", "simulation_name": "", "sample_size": 123 } ``` # POST /v1/create-community Source: https://docs.getbluejay.ai/api-reference/endpoint/create-community POST https://api.getbluejay.ai/v1/create-community Create a community of Digital Humans. Creates a community. A community is a named group of Digital Humans.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-community \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "title": "", "description": "", "digital_human_ids": [ 123 ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "title": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "digital_human_ids": [ 123 ] } ``` # POST /v1/custom-background-noises Source: https://docs.getbluejay.ai/api-reference/endpoint/create-custom-background-noise POST https://api.getbluejay.ai/v1/custom-background-noises Create a custom background noise. Adds an uploaded file to the background noise library. Get `storage_path` from [Create Background Noise Upload URL](/api-reference/endpoint/create-custom-background-noise-upload-url).- An organization can have 20 custom background noises. The 21st returns 400. - The same file twice returns 409.Rate limit: 30 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/custom-background-noises \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "storage_path": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "storage_path": "", "created_at": "", "created_by": "", "usage_count": 123 } ``` # POST /v1/custom-background-noises/upload-url Source: https://docs.getbluejay.ai/api-reference/endpoint/create-custom-background-noise-upload-url POST https://api.getbluejay.ai/v1/custom-background-noises/upload-url Get an upload URL for a background noise. Returns `upload_url` and `storage_path`.1) Send the file bytes to `upload_url` with HTTP PUT. 2) Send `storage_path` to [Create Custom Background Noise](/api-reference/endpoint/create-custom-background-noise).The file name must end in `.mp3` or `.wav`. Other types return 400.Rate limit: 30 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/custom-background-noises/upload-url \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "filename": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # POST /v1/create-metric Source: https://docs.getbluejay.ai/api-reference/endpoint/create-custom-metric POST https://api.getbluejay.ai/v1/create-metric Create a custom metric. Creates one custom metric. `summary` is the short description shown with the metric. Link it to agents with `agent_id` or `agent_ids`.`POST /v1/create-custom-metric` is the deprecated path of this endpoint.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-metric \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "agent_ids": [ 123 ], "name": "", "prompt": "", "summary": "", "metric_type": "llm_judge", "settings": {}, "eval_segment": "agent", "scope": "observability", "response_type": "pass_fail", "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ``` # POST /v1/create-metrics Source: https://docs.getbluejay.ai/api-reference/endpoint/create-custom-metrics POST https://api.getbluejay.ai/v1/create-metrics Create several custom metrics. Creates many custom metrics in one request. Each item takes the fields of [Create Custom Metric](/api-reference/endpoint/create-custom-metric).`POST /v1/create-custom-metrics` is the deprecated path of this endpoint.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-metrics \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "metrics": [ { "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "agent_ids": [ 123 ], "name": "", "prompt": "", "summary": "", "metric_type": "llm_judge", "settings": {}, "eval_segment": "agent", "scope": "observability", "response_type": "pass_fail", "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "metrics": [ { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ] } ``` # POST /v1/create-customer-persona Source: https://docs.getbluejay.ai/api-reference/endpoint/create-customer-persona POST https://api.getbluejay.ai/v1/create-customer-persona Create a customer persona (legacy). Creates a customer persona with `name`, `description`, and `goal`. A customer persona belongs to an agent. It is a different record from a [personality](/api-reference/endpoint/list-personalities).## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-customer-persona \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": 123, "name": "", "description": "", "goal": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "name": "", "description": "", "goal": "", "org_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # POST /v1/dashboards Source: https://docs.getbluejay.ai/api-reference/endpoint/create-dashboard POST https://api.getbluejay.ai/v1/dashboards Create a dashboard. Creates an empty dashboard. Add widgets with [Create Widget](/api-reference/endpoint/create-widget).## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/dashboards \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "", "data_type": "observability" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "is_curated": false, "created_by": "", "created_at": "", "data_type": "", "agent_id": 123, "url": "" } ``` # POST /v1/create-digital-human Source: https://docs.getbluejay.ai/api-reference/endpoint/create-digital-human POST https://api.getbluejay.ai/v1/create-digital-human Create a Digital Human. Creates one Digital Human. The `tag` value and playback fields change which fields are required. The 400 response names the field that failed.`success_criteria` is one string with a bullet per line.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-digital-human \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_ids": [ 123 ], "simulation_id": 123, "digital_human": { "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "name": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "none", "custom_background_noise_url": "", "voice_speed": "slowest", "audio_quality": "high", "fluency": "beginner", "verbosity": "low", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "background_noise_volume": 0.8, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 0.7, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": { "type": "none" }, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": false, "always_on_active": true, "num_runs": 1, "livekit_metadata": {}, "test_name": "", "attack_vector": "", "attack_type": "", "attack_plan": {} } }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "digital_human": { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} }, "simulation_ids": [ 123 ], "simulation_id": 123 } ``` # POST /v1/create-digital-humans Source: https://docs.getbluejay.ai/api-reference/endpoint/create-digital-humans POST https://api.getbluejay.ai/v1/create-digital-humans Create several Digital Humans. Creates many Digital Humans in one request. Each item in `digital_humans` takes the same fields as [Create Digital Human](/api-reference/endpoint/create-digital-human). Items that fail validation return per-item errors. The other items are created.If you omit them, `allow_silence_tool` is `false` and `silence_tool_instructions` is `"default"`.Rate limit: 20 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-digital-humans \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_ids": [ 123 ], "digital_humans": [ { "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "name": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "none", "custom_background_noise_url": "", "voice_speed": "slowest", "audio_quality": "high", "fluency": "beginner", "verbosity": "low", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "background_noise_volume": 0.8, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 0.7, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": { "type": "none" }, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": false, "always_on_active": true, "num_runs": 1, "livekit_metadata": {}, "test_name": "", "attack_vector": "", "attack_type": "", "attack_plan": {} } ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "created": [ { "digital_human": { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": null, "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": null, "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": null, "response_type": "phrase", "response_value": null, "scripted_response_audio_snippet_url": null, "occurrence_mode": "always", "occurrence_n": null, "silence_duration": null } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": null } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": null, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": null, "response_window_seconds": null, "unresponsive": false, "phone_number": null } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} }, "simulation_ids": [ 123 ], "simulation_id": 123 } ], "errors": [ {} ] } ``` # POST /v1/create-folder Source: https://docs.getbluejay.ai/api-reference/endpoint/create-folder POST https://api.getbluejay.ai/v1/create-folder Create a folder. Creates a folder for agents.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-folder \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "organization_id": "", "created_at": "" } ``` # POST /v1/knowledge-base Source: https://docs.getbluejay.ai/api-reference/endpoint/create-knowledge-base POST https://api.getbluejay.ai/v1/knowledge-base Create a Knowledge Base. Creates an empty Knowledge Base. Add documents, then [attach it to an agent](/api-reference/endpoint/attach-agent-to-knowledge-base).Rate limit: 60 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `201` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/knowledge-base \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "" }' ```## Example response```json 201 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "", "name": "", "description": "", "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "", "updated_at": "" } ``` # POST /v1/metrics-lab/lab Source: https://docs.getbluejay.ai/api-reference/endpoint/create-lab POST https://api.getbluejay.ai/v1/metrics-lab/lab Create a Metrics Lab lab. Creates a lab with a set of conversations and custom metrics.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/metrics-lab/lab \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "", "tags": [ "" ], "conversations": [ { "call_id": "", "test_result_id": 123 } ], "metric_ids": [ "" ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "name": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ``` # POST /v1/agents/{agent_id}/labels Source: https://docs.getbluejay.ai/api-reference/endpoint/create-label POST https://api.getbluejay.ai/v1/agents/{agent_id}/labels Create an agent label. Creates a label for an agent. `production` and `latest` return 400. A label that exists returns 409.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/labels \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "label_text": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "agent_id": 123, "label_text": "", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "color": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # POST /v1/metrics-lab/lab/{lab_id}/metric-revisions Source: https://docs.getbluejay.ai/api-reference/endpoint/create-metric-revision POST https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/metric-revisions Create a metric revision in a lab. Creates a revision of a custom metric in a lab. Bluejay sets the revision number. The custom metric does not change.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/metric-revisions \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "custom_metric_id": "", "description": "", "scoring_guidance": "", "eval_route": "", "model": "", "audio_model": "", "temperature": 1.5, "allow_not_applicable": false }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "lab_id": "", "custom_metric_id": "", "revision_number": 123, "description": "", "scoring_guidance": "", "eval_route": "", "model": "", "audio_model": "", "temperature": 1.5, "allow_not_applicable": true, "created_at": "2026-01-01T00:00:00Z" } ``` # POST /v1/personalities Source: https://docs.getbluejay.ai/api-reference/endpoint/create-personalities POST https://api.getbluejay.ai/v1/personalities Create personalities. Creates one or more personalities. Each item needs `name`. All other fields are optional. `role_description` replaces the role description of the Digital Human when the personality runs.Rate limit: 60 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/personalities \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "personalities": [ { "language": "", "accent": "", "gender": "", "background_noise": "none", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "slowest", "audio_quality": "horrible", "fluency": "beginner", "verbosity": "low", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "name": "" } ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "language": "", "accent": "", "gender": "", "background_noise": "", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ] ``` # POST /v1/agents/{agent_id}/versions Source: https://docs.getbluejay.ai/api-reference/endpoint/create-prompt-version POST https://api.getbluejay.ai/v1/agents/{agent_id}/versions Create an agent version. Creates the next agent version of an agent. `prompt_text` is optional. If you omit it, Bluejay copies the current prompt.`POST /v1/agents/{agent_id}/prompts/versions` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "prompt_text": "", "commit_message": "", "labels": [ "" ], "override_label": false, "metadata": {} }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_text": "", "commit_message": "", "labels": [ "" ], "metadata": {}, "version": 123, "agent_id": 123 } ``` # POST /v1/scenario Source: https://docs.getbluejay.ai/api-reference/endpoint/create-scenario POST https://api.getbluejay.ai/v1/scenario Create a scenario. Creates a scenario. `definition` is a React Flow graph with `nodes`, `edges`, and an optional `viewport`. Each node and its `data` must match the typed schemas in the playground.To generate Digital Humans from a scenario, see [Scenario Adherence](/test/simulation-types/scenario-adherence).## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/scenario \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_ids": [], "definition": { "edges": [ { "id": "e-wf-start-n-greet", "source": "wf-start", "target": "n-greet" } ], "nodes": [ { "data": { "id": "wf-start" }, "deletable": false, "draggable": true, "id": "wf-start", "position": { "x": 100, "y": 50 }, "type": "start" }, { "data": { "criteria": "Greet the caller and offer help", "id": "n-greet", "speaker": "agent", "turn": 0, "type": "message" }, "id": "n-greet", "position": { "x": 200, "y": 180 }, "type": "single" } ] }, "description": "Password reset IVR", "name": "Support reset flow" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "agent_ids": [], "name": "", "description": "", "definition": {}, "created_at": "2026-01-01T00:00:00Z", "dh_sync_summary": {}, "warnings": [ "" ] } ``` # POST /v1/create-schedule Source: https://docs.getbluejay.ai/api-reference/endpoint/create-schedule POST https://api.getbluejay.ai/v1/create-schedule Schedule a simulation. Creates a schedule for a simulation. The response returns the schedule as `cron_expression`.`schedule.frequency` selects the shape of `schedule`: every N minutes, every N hours, daily, weekly, monthly, or cron. `timezone` is an IANA name. If it is null, the schedule uses UTC.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-schedule \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "timezone": "", "simulation_id": "", "schedule": { "window": { "days": [ "monday" ], "start_time": "", "end_time": "" }, "frequency": "", "interval": 123 }, "enabled": true }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "simulation_id": "", "cron_expression": "", "enabled": true, "timezone": "" } ``` # POST /v1/scim/Users Source: https://docs.getbluejay.ai/api-reference/endpoint/create-scim-user POST /v1/scim/Users Provision a person. > [!NOTE] > > SCIM endpoints authenticate with a SCIM token from **Settings → Security → User provisioning (SCIM)**, sent as `Authorization: Bearer `. A Bluejay API key does not work here. Identity providers like Okta and Entra call these for you; see [SSO and User Provisioning](/administration/sso-and-provisioning). # POST /v1/create-simulation Source: https://docs.getbluejay.ai/api-reference/endpoint/create-simulation POST https://api.getbluejay.ai/v1/create-simulation Create a simulation. Creates a simulation for an agent and returns `simulation_id`.`prompt_id` is deprecated. Use `agent_version_id`. If you send both and they differ, the response is 400.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/create-simulation \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": "", "name": "", "description": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "max_concurrent": 123, "hangup_on_transfer": false, "max_call_duration": 10, "max_call_duration_units": "minutes", "ringing_timeout": 300, "digital_humans_settings": { "default_name": "random", "default_caller_number": "random", "default_language": "random", "default_background_noise": "none", "first_message": "ai_generated", "num_runs": 1 }, "selected_custom_metrics": [ "3c90c3cc-0d44-4b50-8888-8dd25736052a" ], "custom_metrics_failing_threshold": 123, "custom_metrics_passing_threshold": 123, "runs_per_digital_human": 123, "delay_between_tests_seconds": 1.5, "inactivity_timeout_seconds": 123, "always_on": false }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_id": 123, "status": "200" } ``` # POST /v1/uptime/monitors Source: https://docs.getbluejay.ai/api-reference/endpoint/create-uptime-monitor POST https://api.getbluejay.ai/v1/uptime/monitors Create an uptime monitor. Creates an uptime monitor and the simulation and schedule that run it. `active_window` limits the days and hours. If it is null, the monitor runs at all times.## ChecksEach item in `checks` is one health check that a run grades:```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "latency", "label": "Latency", "enabled": true, "isTemplate": true, "checkType": "latency", "config": { "latency_threshold_ms": 3000, "alert_after_failures": 3 } } ```- A template check has `isTemplate: true` and a `checkType` of `connection`, `agent_malfunction`, or `latency`. - A custom check has `isTemplate: false` and a `customMetricId` with a `condition` of `data_type`, `operator`, and `comparison_value`. - A `digitalHumanId` check changes the caller to that Digital Human. An update replaces the whole `checks` array, so send this check on every update to keep the caller.At least one enabled check must have a `checkType` or a `customMetricId`. If not, the response is 400.## Notifications```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "slack": { "channel": "C0123456789", "notify_channel": true }, "pagerduty": true, "betterstack": true, "incidentio": true, "email": { "scope": "specific", "addresses": ["oncall@example.com"] } } ```## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/uptime/monitors \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": 123, "frequency": "5m", "active_window": { "days": [ "monday" ], "start_time": "", "end_time": "", "timezone": "" }, "checks": [ {} ], "notifications": {}, "enabled": true, "start_at": "" }' ``` # POST /v1/widgets Source: https://docs.getbluejay.ai/api-reference/endpoint/create-widget POST https://api.getbluejay.ai/v1/widgets Create a widget. Creates a widget on a dashboard.- `metrics` is required unless `chart_type` is `table`. - `simulation_ids` must not be empty when `group_by` is `simulation`. - `color_overrides` maps a label to a `#rrggbb` color. Labels match without case.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/widgets \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "", "chart_type": "line", "chart_mode": "time_series", "data_type": "observability", "bar_mode": "stacked", "aggregation": [ "count" ], "time_bucket": "hour", "group_by": "agent", "simulation_ids": [ 123 ], "show_indeterminate": false, "filters": [ null ], "column_visibility": { "key": true }, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "metrics": [ { "metric": "", "custom_metric_id": "", "goal": "", "tool_call_id": "", "metadata_path": "", "threshold_operator": "lt", "threshold_value": 1.5, "metadata_type": "" } ], "dashboard_id": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "chart_type": "", "chart_mode": "", "data_type": "", "applies_to_all_agents": true, "bar_mode": "", "aggregation": [ "" ], "time_bucket": "", "group_by": "", "simulation_ids": [ 123 ], "show_indeterminate": true, "filters": null, "column_visibility": null, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "created_by": "", "created_at": "", "updated_at": "", "widget_metrics": [], "layout": { "x": 123, "y": 123, "w": 123, "h": 123 } } ``` # DELETE /v1/agent/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-agent DELETE https://api.getbluejay.ai/v1/agent/{agent_id} Delete an agent. Deletes an agent by `agent_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/agent/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agent_id": 123, "status": "200", "version": 123, "http_webhook_key": "" } ``` # DELETE /v1/alert/{alert_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-alert DELETE https://api.getbluejay.ai/v1/alert/{alert_id} Delete an alert. Deletes an alert and its agent links.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/alert/{alert_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "", "deleted_alert_id": "" } ``` # DELETE /v1/call-log/{call_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-call-log DELETE https://api.getbluejay.ai/v1/call-log/{call_id} Delete a call log. Deletes a call log. Set `recording_only=true` to delete only the recording file and keep the call log.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/call-log/{call_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "", "status": "200" } ``` # DELETE /v1/community/{community_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-community DELETE https://api.getbluejay.ai/v1/community/{community_id} Delete a community. Deletes a community. The Digital Humans in it are not deleted.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/community/{community_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "title": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "digital_human_ids": [ 123 ] } ``` # DELETE /v1/custom-background-noises/{noise_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-custom-background-noise DELETE https://api.getbluejay.ai/v1/custom-background-noises/{noise_id} Delete a custom background noise. Removes a custom background noise from the library. The stored file is not deleted.The response is 409 while a Digital Human uses the noise. Remove it from those Digital Humans first.Rate limit: 30 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/custom-background-noises/{noise_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # DELETE /v1/metric/{metric_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-custom-metric DELETE https://api.getbluejay.ai/v1/metric/{metric_id} Delete a custom metric. Deletes one custom metric. The metric moves to Recently Deleted.`DELETE /v1/custom-metric/{metric_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/metric/{metric_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "name": "", "prompt": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "source": "custom", "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "min_value": 1.5, "max_value": 1.5, "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "category": "", "tags": [ "" ], "scoring_guidance": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "json_schema": {}, "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workspace_id": "", "allow_not_applicable": false, "template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # POST /v1/delete-metrics Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-custom-metrics POST https://api.getbluejay.ai/v1/delete-metrics Delete several custom metrics. Deletes many custom metrics. Each ID must exist and belong to your organization.`POST /v1/delete-custom-metrics` is the deprecated path of this endpoint.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/delete-metrics \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "custom_metric_ids": [ "" ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "deleted_count": 123, "deleted_metric_ids": [ "" ] } ``` # DELETE /v1/customer-persona/{persona_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-customer-persona DELETE https://api.getbluejay.ai/v1/customer-persona/{persona_id} Delete a customer persona. Deletes a customer persona and its agent links.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/customer-persona/{persona_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "name": "", "description": "", "goal": "", "org_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # DELETE /v1/dashboards/{dashboard_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-dashboard DELETE https://api.getbluejay.ai/v1/dashboards/{dashboard_id} Delete a dashboard. Deletes a dashboard, its widgets, and their metrics. A default dashboard cannot be deleted.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/dashboards/{dashboard_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/digital-human/{digital_human_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-digital-human DELETE https://api.getbluejay.ai/v1/digital-human/{digital_human_id} Delete a Digital Human. Deletes a Digital Human by `digital_human_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/digital-human/{digital_human_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} } ``` # DELETE /v1/folder/{folder_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-folder DELETE https://api.getbluejay.ai/v1/folder/{folder_id} Delete a folder. Deletes a folder. The agents in it stay and have no folder.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/folder/{folder_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "status": "success" } ``` # DELETE /v1/knowledge-base/{knowledge_base_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-knowledge-base DELETE https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id} Delete a Knowledge Base. Deletes a Knowledge Base and returns 204. The Knowledge Base moves to Recently Deleted. Bluejay removes its indexed chunks and marks running ingestion jobs as failed. If you restore it, the documents are ingested again.Rate limit: 60 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `204` response has no body.## Status codes| Status | Meaning | | - | - | | `204` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/metrics-lab/lab/{lab_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-lab DELETE https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id} Delete a Metrics Lab lab. Deletes a lab. The lab moves to Recently Deleted.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "", "deleted_lab_id": "" } ``` # DELETE /v1/agents/{agent_id}/labels/{label_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-label DELETE https://api.getbluejay.ai/v1/agents/{agent_id}/labels/{label_id} Delete an agent label. Deletes a label. You cannot delete `production`, `latest`, or a label that is on a version.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/labels/{label_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/personalities/{personality_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-personality DELETE https://api.getbluejay.ai/v1/personalities/{personality_id} Delete a personality. Deletes a personality and removes it from every simulation that selects it. Past conversations keep the ID of the personality they ran as.Rate limit: 60 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/personalities/{personality_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/agents/{agent_id}/versions/{prompt_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-prompt-by-id DELETE https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{prompt_id} Delete an agent version by prompt ID. Deletes one agent version by UUID.`DELETE /v1/agents/{agent_id}/prompts/{prompt_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{prompt_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/agents/{agent_id}/versions/{version} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-prompt-version DELETE https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version} Delete an agent version by number. Deletes one agent version.- You cannot delete the version with the `production` label. Move the label first. - You cannot delete the only version. - If you delete the `latest` version, the label moves to the highest remaining version.`DELETE /v1/agents/{agent_id}/prompts/versions/{version}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version} \ --header 'X-API-Key: ' ``` # DELETE /v1/agents/{agent_id}/versions Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-prompt-version-by-label DELETE https://api.getbluejay.ai/v1/agents/{agent_id}/versions Delete an agent version by label. Deletes the version that has the `label` you send.- `production` returns 400. Move the label first. - A label with no version returns 404. A label on more than one version returns 400. - You cannot delete the only version. - If you delete the `latest` version, the label moves to the highest remaining version.`DELETE /v1/agents/{agent_id}/prompts/versions` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions \ --header 'X-API-Key: ' ``` # DELETE /v1/scenario/{workflow_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-scenario DELETE https://api.getbluejay.ai/v1/scenario/{workflow_id} Delete a scenario. Deletes a scenario. The scenario moves to Recently Deleted. The response field `deleted_workflow_id` is the scenario UUID.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/scenario/{workflow_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "", "deleted_workflow_id": "" } ``` # DELETE /v1/delete-schedule/{schedule_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-schedule DELETE https://api.getbluejay.ai/v1/delete-schedule/{schedule_id} Delete a schedule. Deletes a schedule. The simulation is not deleted.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/delete-schedule/{schedule_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "status": "success", "message": "" } ``` # DELETE /v1/scim/Users/{scim_user_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-scim-user DELETE /v1/scim/Users/{scim_user_id} Remove a provisioned person. > [!NOTE] > > SCIM endpoints authenticate with a SCIM token from **Settings → Security → User provisioning (SCIM)**, sent as `Authorization: Bearer `. A Bluejay API key does not work here. Identity providers like Okta and Entra call these for you; see [SSO and User Provisioning](/administration/sso-and-provisioning). # DELETE /v1/simulation/{simulation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-simulation DELETE https://api.getbluejay.ai/v1/simulation/{simulation_id} Delete a simulation. Deletes a simulation by `simulation_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/simulation/{simulation_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "", "deleted_simulation_id": 123 } ``` # DELETE /v1/uptime/monitors/{monitor_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-uptime-monitor DELETE https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id} Delete an uptime monitor. Deletes an uptime monitor and stops its scheduled checks.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/widgets/{widget_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/delete-widget DELETE https://api.getbluejay.ai/v1/widgets/{widget_id} Delete a widget. Deletes a widget and its metrics.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/widgets/{widget_id} \ --header 'X-API-Key: ' ``` # DELETE /v1/knowledge-base/{knowledge_base_id}/agents/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/detach-agent-from-knowledge-base DELETE https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id}/agents/{agent_id} Detach an agent from a Knowledge Base. Unlinks an agent from a Knowledge Base and returns 204.Rate limit: 60 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `204` response has no body.## Status codes| Status | Meaning | | - | - | | `204` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id}/agents/{agent_id} \ --header 'X-API-Key: ' ``` # POST /v1/dashboards/{dashboard_id}/duplicate Source: https://docs.getbluejay.ai/api-reference/endpoint/duplicate-dashboard POST https://api.getbluejay.ai/v1/dashboards/{dashboard_id}/duplicate Copy a dashboard. Creates a copy named ` (Copy)` with a copy of each widget in the same layout.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/dashboards/{dashboard_id}/duplicate \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "is_curated": false, "created_by": "", "created_at": "", "data_type": "", "agent_id": 123, "url": "" } ``` # POST /v1/widgets/{widget_id}/duplicate Source: https://docs.getbluejay.ai/api-reference/endpoint/duplicate-widget POST https://api.getbluejay.ai/v1/widgets/{widget_id}/duplicate Copy a widget. Creates a copy named `Copy of ` on the dashboard in `dashboard_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/widgets/{widget_id}/duplicate \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "dashboard_id": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "chart_type": "", "chart_mode": "", "data_type": "", "applies_to_all_agents": true, "bar_mode": "", "aggregation": [ "" ], "time_bucket": "", "group_by": "", "simulation_ids": [ 123 ], "show_indeterminate": true, "filters": null, "column_visibility": null, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "created_by": "", "created_at": "", "updated_at": "", "widget_metrics": [], "layout": { "x": 123, "y": 123, "w": 123, "h": 123 } } ``` # POST /v1/end-conversations Source: https://docs.getbluejay.ai/api-reference/endpoint/end-conversations POST https://api.getbluejay.ai/v1/end-conversations End running simulation conversations. Ends running conversations. The response lists which IDs were marked to end and which failed.Each ID must be a test result in RUNNING status. If the call does not end, Bluejay updates its status after 30 seconds.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/end-conversations \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "test_result_ids": [ 123 ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "success": true, "ended_count": 123, "test_result_ids": [ 123 ], "failed_ids": [ 123 ], "message": "" } ``` # POST /v1/evaluate Source: https://docs.getbluejay.ai/api-reference/endpoint/evaluate POST https://api.getbluejay.ai/v1/evaluate Score a production conversation. Sends one production conversation for evaluation. Identify the agent with `agent_id` or `external_agent_id`. `POST /v1/evaluate-call` is the same endpoint.- Key-value pairs in `metadata` are available as [dynamic variables](/test/metrics/llm-as-a-judge#prompting-guide) in custom metrics. - If you omit `version`, Bluejay uses the version with the `production` label. An unknown `version` uses the production version and returns a `warning`. - An unknown `label` is created and attached to the production version. With `external_agent_id`, `label` defaults to `production`. - If the agent has no production version, the request succeeds and `warning` says so.Rate limit: 100 requests per minute for each organization, or 500 for enterprise accounts.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `400` | A recording\_url or transcript\_url could not be downloaded | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/evaluate \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": "", "recording_url": "https://example.com", "recording_auth_headers": { "key": "" }, "recording_base64": "", "start_time_utc": "2026-01-01T00:00:00Z", "participants": [ { "role": "AGENT", "name": "", "spoke_first": false, "phone_number": "" } ], "call_direction": "INBOUND", "interface": "PHONE", "transcript_url": "https://example.com", "transcript": [ { "start_offset_ms": 123, "end_offset_ms": 123, "speaker": "AGENT", "utterance": "", "filler_utterance": true } ], "emails": [ { "speaker": "AGENT", "raw": "" } ], "tool_calls": [ { "name": "", "start_offset_ms": 123, "description": "", "parameters": {}, "output": null } ], "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "tags": [ "" ], "trace_id": "", "trace_ids": [ "" ], "session_id": "", "created_at": "2026-01-01T00:00:00Z", "metadata": {}, "webhook_tag": "", "custom_metrics": [ "3c90c3cc-0d44-4b50-8888-8dd25736052a" ], "custom_metric_tags": [ "" ], "label": "", "version": 123, "enable_phrase_latencies": true, "conversation_ended_by": "AGENT", "multichannel": false }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "status": "", "call_id": "", "message": "", "warning": "" } ``` # POST /v1/metrics-lab/evaluate-conversation Source: https://docs.getbluejay.ai/api-reference/endpoint/evaluate-lab-conversation POST https://api.getbluejay.ai/v1/metrics-lab/evaluate-conversation Evaluate a lab conversation. Queues an evaluation of one conversation with the metrics you send. The conversation is a production call or a simulation result. Read the result with [Get Lab](/api-reference/endpoint/get-lab).## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/metrics-lab/evaluate-conversation \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "lab_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "conversation": { "type": "obs_conversation", "id": "" }, "metrics": { "type": "custom_metric", "custom_metric_ids": [ "" ], "custom_metric_revision_id": "" } }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "status": "", "message": "", "conversation_id": "", "conversation_type": "", "metrics": [ { "type": "", "id": "", "eval_id": "" } ] } ``` # POST /v1/generate-digital-humans Source: https://docs.getbluejay.ai/api-reference/endpoint/generate-digital-humans POST https://api.getbluejay.ai/v1/generate-digital-humans Generate Digital Humans from an agent prompt. Generates Digital Humans for an agent and links them to the simulation. To generate from a graph, see [Create Scenario](/api-reference/endpoint/create-scenario).This request does not accept `allow_silence_tool` or `silence_tool_instructions`. To set them, use [Update Digital Human](/api-reference/endpoint/update-digital-human).`success_criteria` in the response is one string with a bullet per line.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/generate-digital-humans \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": "", "simulation_id": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "goal_adherence": [ { "goal": "", "num_calls": 123 } ], "workflow_adherence": { "key": 123 }, "workflow_adherence_v2": { "key": 123 }, "replay_transcript": [ { "transcript": "", "success_criteria": "", "mode": "strict" } ], "customer_personas": [ { "name": "", "description": "", "goal": "", "num_calls": 123 } ], "system_prompt": 0, "load_testing": 0, "red_teaming": 0, "red_team_attacks": { "batches": [ { "intent": "", "vector_id": "", "traits": [ { "name": null, "data_type": "string", "value": null, "completeness": null } ], "count": 123, "custom_success_criteria": "" } ] }, "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "num_runs": 1 }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "digital_humans": [ null ], "status": "200", "success": true, "test_scenarios": [ null ], "warning": "" } ``` # POST /v1/generate-intent-summary Source: https://docs.getbluejay.ai/api-reference/endpoint/generate-intent-summary POST https://api.getbluejay.ai/v1/generate-intent-summary Summarize a Digital Human intent. Writes `intent_summary` on a Digital Human. If the intent is 500 characters or shorter, Bluejay clears `intent_summary` and the response has `skipped: true`.The response is 400 if the Digital Human has a workflow or voicemail tag, or has no intent.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/generate-intent-summary \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "test_case_id": 123 }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "intent_summary": "", "test_case_id": 123, "skipped": false } ``` # POST /v1/generate-objectives Source: https://docs.getbluejay.ai/api-reference/endpoint/generate-objectives POST https://api.getbluejay.ai/v1/generate-objectives Generate objectives for a Digital Human. Generates objectives from the intent of a Digital Human and saves them on the Digital Human.The response is 400 if the Digital Human has a workflow or voicemail tag, or has no intent.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/generate-objectives \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "test_case_id": 123 }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "objectives": "", "test_case_id": 123 } ``` # GET /v1/agents/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-agent GET https://api.getbluejay.ai/v1/agents/{agent_id} Get an agent. Returns one agent by `agent_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "agent_description": "", "organization_id": "", "workspace_id": "", "goals": [ "" ], "mode": "VOICE", "type": "INBOUND", "connection_type": "SMS", "phone_number": "", "email_address": "", "email_reply_addresses": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "websocket_url": "", "redact_pii": true, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "updated_by_api_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "keyterms": [ "" ], "voice_provider": "", "provider_id": "", "websocket_username": "", "websocket_password": "", "external_agent_id": "", "sip_uri": "", "custom_sip_headers": {}, "sip_username": "", "sip_password": "", "simulation_notifications": {}, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_key": "", "http_webhook_sync_reply": true, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "bland_pathway_id": "", "bland_agent_id": "", "bland_persona_id": "", "bland_call_settings": {}, "provider_request_data": {}, "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "kore_inbound_token": "", "enable_outbound_call_auto_start": true, "simulations_disabled": false, "workflow": {}, "provider": "CUSTOM", "red_team_profile": {} } ``` # GET /v1/agent-by-external-id/{external_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-agent-by-external-id GET https://api.getbluejay.ai/v1/agent-by-external-id/{external_id} Get an agent by external ID. Returns one agent by `external_agent_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agent-by-external-id/{external_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "agent_description": "", "organization_id": "", "workspace_id": "", "goals": [ "" ], "mode": "VOICE", "type": "INBOUND", "connection_type": "SMS", "phone_number": "", "email_address": "", "email_reply_addresses": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "websocket_url": "", "redact_pii": true, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "updated_by_api_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "keyterms": [ "" ], "voice_provider": "", "provider_id": "", "websocket_username": "", "websocket_password": "", "external_agent_id": "", "sip_uri": "", "custom_sip_headers": {}, "sip_username": "", "sip_password": "", "simulation_notifications": {}, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_key": "", "http_webhook_sync_reply": true, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "bland_pathway_id": "", "bland_agent_id": "", "bland_persona_id": "", "bland_call_settings": {}, "provider_request_data": {}, "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "kore_inbound_token": "", "enable_outbound_call_auto_start": true, "simulations_disabled": false, "workflow": {}, "provider": "CUSTOM", "red_team_profile": {} } ``` # GET /v1/get-agents-by-folder/{folder_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-agents-by-folder GET https://api.getbluejay.ai/v1/get-agents-by-folder/{folder_id} List the agents in a folder. Returns the ID and name of each agent in a folder.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/get-agents-by-folder/{folder_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "agent_description": "", "organization_id": "", "workspace_id": "", "goals": [ "" ], "mode": "VOICE", "type": "INBOUND", "connection_type": "SMS", "phone_number": "", "email_address": "", "email_reply_addresses": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "websocket_url": "", "redact_pii": true, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "updated_by_api_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "keyterms": [ "" ], "voice_provider": "", "provider_id": "", "websocket_username": "", "websocket_password": "", "external_agent_id": "", "sip_uri": "", "custom_sip_headers": {}, "sip_username": "", "sip_password": "", "simulation_notifications": {}, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_key": "", "http_webhook_sync_reply": true, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "bland_pathway_id": "", "bland_agent_id": "", "bland_persona_id": "", "bland_call_settings": {}, "provider_request_data": {}, "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "kore_inbound_token": "", "enable_outbound_call_auto_start": true, "simulations_disabled": false, "workflow": {}, "provider": "CUSTOM", "red_team_profile": {} } ] ``` # GET /v1/alerts/{alert_id}/results Source: https://docs.getbluejay.ai/api-reference/endpoint/get-alert-results GET https://api.getbluejay.ai/v1/alerts/{alert_id}/results Get the results of an alert. Returns the times an alert fired, newest first. A simulation result links to the simulation and run. An observability result links to the call. Filter with `source`. `page_size` is 20 by default and 100 at most.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/alerts/{alert_id}/results \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "alert_id": "", "source_scope": "", "results": [ { "id": "", "alert_id": "", "created_at": "2026-01-01T00:00:00Z", "triggered_by_entity_type": "", "triggered_by_entity_id": "", "entity_field": "", "actual_value": "", "expected_value": "", "operator_used": "", "agent_id": 123, "metadata": {}, "source": "", "simulation": { "simulation_id": 123, "simulation_name": "", "simulation_run_id": 123, "test_result_id": 123, "run_status": "" }, "observability": { "call_id": "", "call_status": "", "started_at": "2026-01-01T00:00:00Z" } } ], "total_count": 123, "page": 123, "page_size": 123, "items_in_page": 123, "total_pages": 123 } ``` # GET /v1/alerts Source: https://docs.getbluejay.ai/api-reference/endpoint/get-alerts GET https://api.getbluejay.ai/v1/alerts List alerts. Returns the alerts in your organization. Filter with `source_scope`.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/alerts \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "", "name": "", "description": "", "is_enabled": true, "organization_id": "", "entity_type": "standard_metric", "entity_field": "", "operator": "equals", "comparison_value": "", "notification_channels": [ null ], "last_triggered_at": "2026-01-01T00:00:00Z", "trigger_count": 123, "created_by": "", "applies_to_all_agents": true, "agents": [ 123 ], "simulation_id": 123, "evaluation_scope": "", "aggregation": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "threshold_time_interval": 123, "min_events": 123, "min_events_type": "events", "in_alert": true, "source_scope": "all", "simulation_name": "", "sample_size": 123 } ] ``` # GET /v1/all-agents Source: https://docs.getbluejay.ai/api-reference/endpoint/get-all-agents GET https://api.getbluejay.ai/v1/all-agents List agents. Returns all agents in your organization.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/all-agents \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "agent_description": "", "organization_id": "", "workspace_id": "", "goals": [ "" ], "mode": "VOICE", "type": "INBOUND", "connection_type": "SMS", "phone_number": "", "email_address": "", "email_reply_addresses": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "websocket_url": "", "redact_pii": true, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "updated_by_api_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "keyterms": [ "" ], "voice_provider": "", "provider_id": "", "websocket_username": "", "websocket_password": "", "external_agent_id": "", "sip_uri": "", "custom_sip_headers": {}, "sip_username": "", "sip_password": "", "simulation_notifications": {}, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_key": "", "http_webhook_sync_reply": true, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "bland_pathway_id": "", "bland_agent_id": "", "bland_persona_id": "", "bland_call_settings": {}, "provider_request_data": {}, "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "kore_inbound_token": "", "enable_outbound_call_auto_start": true, "simulations_disabled": false, "workflow": {}, "provider": "CUSTOM", "red_team_profile": {} } ] ``` # GET /v1/digital-humans Source: https://docs.getbluejay.ai/api-reference/endpoint/get-all-digital-humans GET https://api.getbluejay.ai/v1/digital-humans List Digital Humans. Returns the Digital Humans in your organization, newest first. `page_size` is 20 by default and 100 at most. Read `total_pages` to know when to stop.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/digital-humans \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "digital_humans": [ { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} } ], "total_count": 123, "page": 123, "page_size": 123, "total_pages": 123 } ``` # GET /v1/all-folders Source: https://docs.getbluejay.ai/api-reference/endpoint/get-all-folders GET https://api.getbluejay.ai/v1/all-folders List folders. Returns all folders in your organization.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/all-folders \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "organization_id": "", "created_at": "" } ] ``` # GET /v1/get-all-simulations Source: https://docs.getbluejay.ai/api-reference/endpoint/get-all-simulations GET https://api.getbluejay.ai/v1/get-all-simulations List simulations. Returns all simulations in your organization, for all agents.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/get-all-simulations \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulations": [ { "id": 123, "name": "", "agent_id": 123, "created_at": "2026-01-01T00:00:00Z", "settings": {}, "selected_custom_metrics": [ "" ] } ] } ``` # GET /v1/communities Source: https://docs.getbluejay.ai/api-reference/endpoint/get-communities GET https://api.getbluejay.ai/v1/communities List communities. Returns the communities in your organization. Filter by Digital Human with the query parameter.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/communities \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "communities": [ { "id": "", "title": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "digital_human_ids": [ 123 ] } ], "total_count": 123 } ``` # GET /v1/community/{community_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-community GET https://api.getbluejay.ai/v1/community/{community_id} Get a community. Returns one community by `community_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/community/{community_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "title": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "digital_human_ids": [ 123 ] } ``` # GET /v1/observability/conversations/{conversation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-conversation GET https://api.getbluejay.ai/v1/observability/conversations/{conversation_id} Get a production conversation. Returns one production conversation with its transcript and metric results. Set `include_transcript=false` to leave out the transcript.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/observability/conversations/{conversation_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "conversation": { "obs_conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "status": "INITIALIZING", "multichannel_requested": true, "tool_calls": [ { "tool_name": "", "start_offset_ms": 0, "tool_input": {}, "tool_output": "" } ], "initiation_direction": "INBOUND", "tags": [ "" ], "interface": "PHONE", "metadata": {}, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "conversation_ended_by": "AGENT", "trace_ids": [ "" ], "start_time_utc": "2026-01-01T00:00:00Z", "duration_ms": 123, "participants": [ { "role": "AGENT", "name": "", "spoke_first": false, "phone_number": "" } ], "submitted_recording_url": "", "submitted_transcript_url": "", "submitted_transcript": [ { "start_offset_ms": 123, "end_offset_ms": 123, "speaker": "", "utterance": "", "filler_utterance": true } ], "bluejay_recording_filepath": "", "bluejay_transcript_filepath": "", "bluejay_transcript": [ {} ], "bluejay_translated_transcript": [ {} ], "bluejay_words_transcript": [ {} ], "bluejay_reference_transcript": [ {} ], "bluejay_translated_transcript_filepath": "", "bluejay_words_transcript_filepath": "", "bluejay_reference_transcript_filepath": "", "error_code": "", "error_message": "", "error_details": {}, "metric_results": [ {} ] }, "transcript": [ {} ], "tool_calls": [ {} ], "metric_results": [ {} ], "error_code": "", "error_message": "" } ``` # GET /v1/metric/{metric_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-custom-metric GET https://api.getbluejay.ai/v1/metric/{metric_id} Get a custom metric. Returns one custom metric.`GET /v1/custom-metric/{metric_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/metric/{metric_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ``` # GET /v1/metrics Source: https://docs.getbluejay.ai/api-reference/endpoint/get-custom-metrics GET https://api.getbluejay.ai/v1/metrics List custom metrics. Returns custom metrics. Filter with `agent_id`. `page_size` is 50 by default.`GET /v1/custom-metrics` is the deprecated path of this endpoint.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/metrics \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "metrics": [ { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ], "total_count": 123, "page": 123, "page_size": 123, "items_in_page": 123, "total_pages": 123, "data": [ { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ] } ``` # GET /v1/custom-metrics-by-agent/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-custom-metrics-by-agent GET https://api.getbluejay.ai/v1/custom-metrics-by-agent/{agent_id} List the custom metrics of an agent. > [!WARNING] > > This endpoint is deprecated. Use [Get Custom Metrics](/api-reference/endpoint/get-custom-metrics) with `agent_id`.Returns the custom metrics of one agent.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/custom-metrics-by-agent/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "metrics": [ { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ], "total_count": 123, "page": 123, "page_size": 123, "items_in_page": 123, "total_pages": 123, "data": [ { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ] } ``` # GET /v1/customer-persona/{persona_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-customer-persona GET https://api.getbluejay.ai/v1/customer-persona/{persona_id} Get a customer persona. Returns one customer persona by `persona_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/customer-persona/{persona_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "name": "", "description": "", "goal": "", "org_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # GET /v1/customer-personas-by-agent/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-customer-persona-by-agent GET https://api.getbluejay.ai/v1/customer-personas-by-agent/{agent_id} List the customer personas of an agent. Returns the customer personas for one agent.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/customer-personas-by-agent/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "name": "", "description": "", "goal": "", "org_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ] ``` # GET /v1/dashboards/{dashboard_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-dashboard GET https://api.getbluejay.ai/v1/dashboards/{dashboard_id} Get a dashboard. Returns a dashboard and its widgets, in layout order.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/dashboards/{dashboard_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "is_curated": false, "created_by": "", "created_at": "", "data_type": "", "agent_id": 123, "url": "", "widgets": [] } ``` # GET /v1/digital-human/{digital_human_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-digital-human GET https://api.getbluejay.ai/v1/digital-human/{digital_human_id} Get a Digital Human. Returns one Digital Human by `digital_human_id`.`success_criteria` is one string with a bullet per line.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/digital-human/{digital_human_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "digital_human": { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} }, "simulation_ids": [ 123 ], "simulation_id": 123 } ``` # GET /v1/digital-humans-by-simulation/{simulation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-digital-humans-by-simulation GET https://api.getbluejay.ai/v1/digital-humans-by-simulation/{simulation_id} List the Digital Humans in a simulation. Returns the Digital Humans linked to a simulation.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/digital-humans-by-simulation/{simulation_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "digital_humans": [ { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} } ], "total": 123, "simulation_id": 123 } ``` # GET /v1/folder/{folder_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-folder GET https://api.getbluejay.ai/v1/folder/{folder_id} Get a folder. Returns one folder.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/folder/{folder_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "organization_id": "", "created_at": "" } ``` # GET /v1/observability/issues/{issue_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-issue GET https://api.getbluejay.ai/v1/observability/issues/{issue_id} Get an issue. Returns one issue. `GET /v1/issues/{issue_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/observability/issues/{issue_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "type": "", "title": "", "description": "", "status": "", "priority": "", "assignee_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "due_date": "2026-01-01", "error_source": "", "error_code": "", "error_signature": "", "cluster_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "first_seen_at": "2026-01-01T00:00:00Z", "last_seen_at": "2026-01-01T00:00:00Z", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ``` # GET /v1/knowledge-base/{knowledge_base_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-knowledge-base GET https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id} Get a Knowledge Base. Returns a Knowledge Base and its documents. Each document has an ingestion `status`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "", "name": "", "description": "", "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "", "updated_at": "", "documents": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "type": "", "created_at": "", "status": "" } ] } ``` # GET /v1/metrics-lab/lab/{lab_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-lab GET https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id} Get a Metrics Lab lab. Returns the full lab. Poll this endpoint after you queue evaluations. Each evaluation has a `status`, such as `QUEUED`, `EVALUATING`, or `COMPLETED`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "lab": { "id": "", "name": "", "description": "", "tags": [ "" ], "created_at": "2026-01-01T00:00:00Z" }, "conversations": [ { "id": "", "type": "obs_conversation", "call_id": "", "test_result_id": 123, "agent_id": 0, "start_time_utc": "2026-01-01T00:00:00Z", "duration_ms": 123, "duration_s": 123, "status": "", "tags": [ "" ] } ], "metrics": [ { "id": "", "name": "", "prompt": "", "response_type": "", "category": "", "min_value": 1.5, "max_value": 1.5, "enum_options": [ "" ], "eval_route": "", "model": "", "audio_model": "", "temperature": 1.5, "allow_not_applicable": true } ], "human_evaluations": [ { "id": "", "custom_metric_id": "", "call_id": "", "test_result_id": 123, "human_response_value": "", "human_reasoning": "", "created_at": "2026-01-01T00:00:00Z" } ], "ai_evaluations": [ { "id": "", "custom_metric_id": "", "call_id": "", "test_result_id": 123, "response_value": "", "reasoning": "", "status": "", "created_at": "2026-01-01T00:00:00Z" } ], "metric_revisions": [ { "id": "", "custom_metric_id": "", "lab_id": "", "revision_number": 123, "description": "", "eval_route": "", "model": "", "audio_model": "", "temperature": 1.5, "eval_enabled": "", "allow_not_applicable": true, "created_at": "2026-01-01T00:00:00Z" } ], "lab_ai_evaluations": [ { "id": "", "lab_metric_revision_id": "", "call_id": "", "test_result_id": 123, "response_value": "", "reasoning": "", "status": "", "created_at": "2026-01-01T00:00:00Z" } ] } ``` # GET /v1/agents/{agent_id}/labels/{label_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-label-by-id GET https://api.getbluejay.ai/v1/agents/{agent_id}/labels/{label_id} Get an agent label. Returns one label.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/labels/{label_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "agent_id": 123, "label_text": "", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "color": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # GET /v1/agents/{agent_id}/versions/{prompt_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-prompt-by-id GET https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{prompt_id} Get an agent version by prompt ID. Returns one agent version by UUID.`GET /v1/agents/{agent_id}/prompts/{prompt_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{prompt_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_text": "", "commit_message": "", "labels": [ "" ], "metadata": {}, "version": 123, "agent_id": 123 } ``` # GET /v1/agents/{agent_id}/prompts Source: https://docs.getbluejay.ai/api-reference/endpoint/get-prompt-by-label GET https://api.getbluejay.ai/v1/agents/{agent_id}/prompts Get an agent version by label (deprecated). > [!WARNING] > > This endpoint is deprecated. Use [List Agent Versions](/api-reference/endpoint/list-prompt-versions) with `label`.Returns one version by `label`.- No `label` returns 400. - A label with no version returns 404. - A label on more than one version returns 400. `latest` is always on one version.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/prompts \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_text": "", "commit_message": "", "labels": [ "" ], "metadata": {}, "version": 123, "agent_id": 123 } ``` # GET /v1/agents/{agent_id}/versions/{version} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-prompt-version GET https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version} Get an agent version by number. Returns one agent version by number.`GET /v1/agents/{agent_id}/prompts/versions/{version}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_text": "", "commit_message": "", "labels": [ "" ], "metadata": {}, "version": 123, "agent_id": 123 } ``` # GET /v1/red-team-simulations/entitlements Source: https://docs.getbluejay.ai/api-reference/endpoint/get-red-team-entitlements GET https://api.getbluejay.ai/v1/red-team-simulations/entitlements Check your Red Teaming entitlements. Returns `custom_matrix`. If `true`, your organization can send `attack_quotas` when you [start a red team test](/api-reference/endpoint/start-red-team-simulation).Rate limit: 60 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/red-team-simulations/entitlements \ --header 'X-API-Key: ' ``` # GET /v1/red-team-simulations/{test_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-red-team-simulation GET https://api.getbluejay.ai/v1/red-team-simulations/{test_id} Get a Red Teaming run. Returns one red team test by `test_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/red-team-simulations/{test_id} \ --header 'X-API-Key: ' ``` # GET /v1/scenario/{workflow_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-scenario GET https://api.getbluejay.ai/v1/scenario/{workflow_id} Get a scenario. Returns one scenario with its full `definition`. The path parameter `workflow_id` is the scenario UUID.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/scenario/{workflow_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "agent_ids": [], "name": "", "description": "", "definition": {}, "created_at": "2026-01-01T00:00:00Z", "dh_sync_summary": {}, "warnings": [ "" ] } ``` # GET /v1/schedule/{schedule_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-schedule GET https://api.getbluejay.ai/v1/schedule/{schedule_id} Get a schedule. Returns one schedule by `schedule_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/schedule/{schedule_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "simulation_id": "", "cron_expression": "", "enabled": true, "created_at": "", "timezone": "" } ``` # GET /v1/scim/Users/{scim_user_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-scim-user GET /v1/scim/Users/{scim_user_id} Get a provisioned person. > [!NOTE] > > SCIM endpoints authenticate with a SCIM token from **Settings → Security → User provisioning (SCIM)**, sent as `Authorization: Bearer `. A Bluejay API key does not work here. Identity providers like Okta and Entra call these for you; see [SSO and User Provisioning](/administration/sso-and-provisioning). # GET /v1/self-improve/runs/{run_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-self-improve-run GET https://api.getbluejay.ai/v1/self-improve/runs/{run_id} Get a Self-Improve run. Returns one Self-Improve run by `run_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/self-improve/runs/{run_id} \ --header 'X-API-Key: ' ``` # GET /v1/simulation/{simulation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-simulation GET https://api.getbluejay.ai/v1/simulation/{simulation_id} Get a simulation. Returns one simulation by `simulation_id`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/simulation/{simulation_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "name": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "settings": {}, "type": "max_concurrent", "max_concurrent": 123, "max_turns": 123, "ringing_timeout": 123, "inactivity_timeout_seconds": 123, "tags": [ "" ], "description": "", "pinned": true, "always_on": true } ``` # GET /v1/simulations/{simulation_id}/personalities Source: https://docs.getbluejay.ai/api-reference/endpoint/get-simulation-personalities GET https://api.getbluejay.ai/v1/simulations/{simulation_id}/personalities List the personalities of a simulation. Returns the personalities that a simulation runs with.Rate limit: 120 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/simulations/{simulation_id}/personalities \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "language": "", "accent": "", "gender": "", "background_noise": "", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ] ``` # GET /v1/get-simulation-runs/{simulation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-simulation-runs GET https://api.getbluejay.ai/v1/get-simulation-runs/{simulation_id} List the runs of a simulation. Returns the runs of a simulation.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/get-simulation-runs/{simulation_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_runs": [ { "id": 123, "experiment_id": 123, "summary": "", "tests_passed": 123, "tests_failed": 123, "total_tests": 123, "tests_completed": 123, "curr_step_id": 123, "created_at": "2026-01-01T00:00:00Z", "status": "RUNNING", "phone_number": "", "eval_failed": 123 } ] } ``` # GET /v1/get-simulations-by-agent/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-simulations-by-agent GET https://api.getbluejay.ai/v1/get-simulations-by-agent/{agent_id} List the simulations of an agent. Returns the simulations for one agent.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/get-simulations-by-agent/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulations": [ { "id": 123, "name": "", "agent_id": 123, "created_at": "2026-01-01T00:00:00Z", "settings": {}, "selected_custom_metrics": [ "" ] } ] } ``` # POST /v1/spans/{trace_id}/{span_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-span POST https://api.getbluejay.ai/v1/spans/{trace_id}/{span_id} Get a span. Returns one span of a trace. This endpoint uses POST but does not change data.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/spans/{trace_id}/{span_id} \ --header 'X-API-Key: ' ``` # POST /v1/traces/{trace_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-trace POST https://api.getbluejay.ai/v1/traces/{trace_id} Get a trace. Returns one trace and its spans. This endpoint uses POST but does not change data.A trace with more than 200,000 spans returns 413. A trace that is not in your organization returns 403.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/traces/{trace_id} \ --header 'X-API-Key: ' ``` # GET /v1/uptime/monitors/{monitor_id}/checks/{check_id}/transcript Source: https://docs.getbluejay.ai/api-reference/endpoint/get-uptime-check-transcript GET https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/checks/{check_id}/transcript Get the transcript of an uptime check. Returns the transcript of one check. Exactly one of `transcript_url` and `transcript` has a value. `transcript_url` is a signed URL that expires soon. Both are null when there is no transcript.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/checks/{check_id}/transcript \ --header 'X-API-Key: ' ``` # GET /v1/uptime/monitors/{monitor_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-uptime-monitor GET https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id} Get an uptime monitor. Returns one uptime monitor and its recent checks.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id} \ --header 'X-API-Key: ' ``` # GET /v1/uptime/monitors/{monitor_id}/series Source: https://docs.getbluejay.ai/api-reference/endpoint/get-uptime-monitor-series GET https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/series Get the history of an uptime monitor. Returns outcome counts, uptime percentage, and p50, p90, p95, and p99 latency per time bucket. `days` is 7 by default and 365 at most.> [!WARNING] > > This endpoint needs a signed-in user token. A request with an API key returns 400.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/series \ --header 'X-API-Key: ' ``` # GET /v1/widgets/{widget_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/get-widget GET https://api.getbluejay.ai/v1/widgets/{widget_id} Get a widget. Returns one widget and its metrics.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/widgets/{widget_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "chart_type": "", "chart_mode": "", "data_type": "", "applies_to_all_agents": true, "bar_mode": "", "aggregation": [ "" ], "time_bucket": "", "group_by": "", "simulation_ids": [ 123 ], "show_indeterminate": true, "filters": null, "column_visibility": null, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "created_by": "", "created_at": "", "updated_at": "", "widget_metrics": [], "layout": { "x": 123, "y": 123, "w": 123, "h": 123 } } ``` # GET /v1/agents/{agent_id}/workflow/summary Source: https://docs.getbluejay.ai/api-reference/endpoint/get-workflow-summary GET https://api.getbluejay.ai/v1/agents/{agent_id}/workflow/summary Get the workflow of an agent. Returns the [workflow](/test/simulations/reference#workflow) of one agent as `nodes` and `edges`. Use a node ID in a [conditional metric](/test/metrics#add-metric-conditions). If the agent has no workflow provider, the request returns `400`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/workflow/summary \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # GET /v1/integrations/amelia/agents Source: https://docs.getbluejay.ai/api-reference/endpoint/list-amelia-agents GET https://api.getbluejay.ai/v1/integrations/amelia/agents List Amelia agents. Returns the AI agent names in one Amelia domain. Set `domain_code` to the domain code of the bot.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url 'https://api.getbluejay.ai/v1/integrations/amelia/agents?domain_code=' \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # GET /v1/integrations/amelia/flows Source: https://docs.getbluejay.ai/api-reference/endpoint/list-amelia-flows GET https://api.getbluejay.ai/v1/integrations/amelia/flows List Amelia conversation flows. Returns the flow names in one Amelia domain. Set `domain_code` to the domain code of the bot. To use a flow, set `amelia_flow_name` with [Update Agent](/api-reference/endpoint/update-agent).## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url 'https://api.getbluejay.ai/v1/integrations/amelia/flows?domain_code=' \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # GET /v1/observability/conversations Source: https://docs.getbluejay.ai/api-reference/endpoint/list-conversations GET https://api.getbluejay.ai/v1/observability/conversations List production conversations. Returns production conversations, newest first. Each row has `metric_results`.Set `group_by` to get counts per group instead of rows. You can group by status, agent, label, day, interface, direction, ended\_by, a `metadata_path`, or `metric_value`. The same filters apply to rows and counts.`page_size` is 20 by default and 100 at most.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/observability/conversations \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "total": 123, "group_by": "", "data": [ { "obs_conversation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "status": "INITIALIZING", "multichannel_requested": true, "tool_calls": [ { "tool_name": "", "start_offset_ms": 0, "tool_input": {}, "tool_output": "" } ], "initiation_direction": "INBOUND", "tags": [ "" ], "interface": "PHONE", "metadata": {}, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ null ], "metadata": {} } ], "conversation_ended_by": "AGENT", "trace_ids": [ "" ], "start_time_utc": "2026-01-01T00:00:00Z", "duration_ms": 123, "participants": [ { "role": "AGENT", "name": "", "spoke_first": false, "phone_number": "" } ], "submitted_recording_url": "", "submitted_transcript_url": "", "submitted_transcript": [ { "start_offset_ms": 123, "end_offset_ms": 123, "speaker": "", "utterance": "", "filler_utterance": true } ], "bluejay_recording_filepath": "", "bluejay_transcript_filepath": "", "bluejay_transcript": [ {} ], "bluejay_translated_transcript": [ {} ], "bluejay_words_transcript": [ {} ], "bluejay_reference_transcript": [ {} ], "bluejay_translated_transcript_filepath": "", "bluejay_words_transcript_filepath": "", "bluejay_reference_transcript_filepath": "", "error_code": "", "error_message": "", "error_details": {}, "metric_results": [ {} ] } ], "breakdown": [ { "group": "", "count": 123, "avg_duration_ms": 1.5, "edited_count": 123 } ], "groups_truncated": false, "metric_name": "", "metric_type": "", "not_applicable": 123, "average": 1.5, "page": 123, "page_size": 123, "unreadable_skipped": 0 } ``` # GET /v1/custom-background-noises Source: https://docs.getbluejay.ai/api-reference/endpoint/list-custom-background-noises GET https://api.getbluejay.ai/v1/custom-background-noises List custom background noises. Returns the custom background noises in your organization, oldest first. `usage_count` is the number of Digital Humans that use each noise.Rate limit: 60 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/custom-background-noises \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "", "organization_id": "", "name": "", "storage_path": "", "created_at": "", "created_by": "", "usage_count": 123 } ] ``` # GET /v1/dashboards Source: https://docs.getbluejay.ai/api-reference/endpoint/list-dashboards GET https://api.getbluejay.ai/v1/dashboards List dashboards. Returns dashboards, newest first. Filter with `data_type`: `observability` or `simulation`.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/dashboards \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "", "organization_id": "", "name": "", "description": "", "is_curated": false, "created_by": "", "created_at": "", "data_type": "", "agent_id": 123, "url": "" } ] ``` # GET /v1/observability/issues Source: https://docs.getbluejay.ai/api-reference/endpoint/list-issues GET https://api.getbluejay.ai/v1/observability/issues List issues. An issue is a problem that Bluejay finds across your calls. A single failure that does not repeat is not an issue.- `non_deterministic` (Pattern in the dashboard): Bluejay groups similar failures. It shows when the same problem occurs again across calls. - `deterministic` (Error in the dashboard): an error that Bluejay recognizes at once, such as a tool call that returns 500.Results are newest first by last seen. `limit` is 50 by default and 200 at most. Use `offset` for the next page.`GET /v1/issues` is the deprecated path of this endpoint.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/observability/issues \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "type": "", "title": "", "description": "", "status": "", "priority": "", "assignee_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "due_date": "2026-01-01", "error_source": "", "error_code": "", "error_signature": "", "cluster_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "first_seen_at": "2026-01-01T00:00:00Z", "last_seen_at": "2026-01-01T00:00:00Z", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ] ``` # GET /v1/knowledge-base Source: https://docs.getbluejay.ai/api-reference/endpoint/list-knowledge-bases GET https://api.getbluejay.ai/v1/knowledge-base List Knowledge Bases. Returns the Knowledge Bases in your organization, each with `document_count`.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/knowledge-base \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "", "name": "", "description": "", "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "", "updated_at": "", "document_count": 0 } ] ``` # GET /v1/agents/{agent_id}/labels Source: https://docs.getbluejay.ai/api-reference/endpoint/list-labels GET https://api.getbluejay.ai/v1/agents/{agent_id}/labels List the labels of an agent. Returns the labels of an agent. Filter by substring with `q`.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/labels \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "agent_id": 123, "label_text": "", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "color": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ] ``` # GET /v1/metrics-lab/labs Source: https://docs.getbluejay.ai/api-reference/endpoint/list-labs GET https://api.getbluejay.ai/v1/metrics-lab/labs List Metrics Lab labs. Returns labs, newest first, with counts. `page_size` is 20 by default and 100 at most.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/metrics-lab/labs \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "labs": [ { "id": "", "name": "", "description": "", "tags": [ "" ], "created_at": "2026-01-01T00:00:00Z", "conversation_count": 0, "metric_count": 0, "revision_count": 0 } ], "total_count": 123 } ``` # GET /v1/personalities Source: https://docs.getbluejay.ai/api-reference/endpoint/list-personalities GET https://api.getbluejay.ai/v1/personalities List personalities. Returns the personality library of your organization. A personality changes how a call is delivered. It does not change the intent or the success criteria.Rate limit: 120 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/personalities \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "language": "", "accent": "", "gender": "", "background_noise": "", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ] ``` # GET /v1/agents/{agent_id}/versions/{version}/labels Source: https://docs.getbluejay.ai/api-reference/endpoint/list-prompt-version-labels GET https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version}/labels List the labels of an agent version. Returns the labels on one agent version.`GET /v1/agents/{agent_id}/prompts/versions/{version}/labels` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version}/labels \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "labels": [ "" ] } ``` # GET /v1/agents/{agent_id}/versions Source: https://docs.getbluejay.ai/api-reference/endpoint/list-prompt-versions GET https://api.getbluejay.ai/v1/agents/{agent_id}/versions List the versions of an agent. Returns the agent versions of an agent. Filter with `label` or `version`.`GET /v1/agents/{agent_id}/prompts/versions` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_text": "", "commit_message": "", "labels": [ "" ], "metadata": {}, "version": 123, "agent_id": 123 } ] ``` # GET /v1/red-team-simulations Source: https://docs.getbluejay.ai/api-reference/endpoint/list-red-team-simulations GET https://api.getbluejay.ai/v1/red-team-simulations List Red Teaming runs. Returns the red team tests for the agents you can see. Filter with `agent_id` and `status`.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/red-team-simulations \ --header 'X-API-Key: ' ``` # GET /v1/scenario Source: https://docs.getbluejay.ai/api-reference/endpoint/list-scenarios GET https://api.getbluejay.ai/v1/scenario List scenarios. Returns `workflows` and `total_count`. The key `workflows` holds the scenarios. The name stays for backward compatibility. The agent filter applies only to agents in your organization.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/scenario \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "workflows": [ { "id": "", "organization_id": "", "agent_ids": [], "name": "", "description": "", "definition": {}, "created_at": "2026-01-01T00:00:00Z", "dh_sync_summary": {}, "warnings": [ "" ] } ], "total_count": 123 } ``` # GET /v1/schedules Source: https://docs.getbluejay.ai/api-reference/endpoint/list-schedules GET https://api.getbluejay.ai/v1/schedules List schedules. Returns the schedules for the agents you can see.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/schedules \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "schedules": [ { "id": "", "simulation_id": "", "cron_expression": "", "enabled": true, "created_at": "", "timezone": "" } ] } ``` # GET /v1/scim/Users Source: https://docs.getbluejay.ai/api-reference/endpoint/list-scim-users GET /v1/scim/Users List provisioned people. > [!NOTE] > > SCIM endpoints authenticate with a SCIM token from **Settings → Security → User provisioning (SCIM)**, sent as `Authorization: Bearer `. A Bluejay API key does not work here. Identity providers like Okta and Entra call these for you; see [SSO and User Provisioning](/administration/sso-and-provisioning). # GET /v1/self-improve/runs Source: https://docs.getbluejay.ai/api-reference/endpoint/list-self-improve-runs GET https://api.getbluejay.ai/v1/self-improve/runs List Self-Improve runs. Returns the Self-Improve runs for the agents you can see. Filter with `agent_id` and `status`.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/self-improve/runs \ --header 'X-API-Key: ' ``` # GET /v1/traces Source: https://docs.getbluejay.ai/api-reference/endpoint/list-traces GET https://api.getbluejay.ai/v1/traces List traces. Returns recent traces for the conversations you can see. `limit` is 50 by default and 100 at most.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/traces \ --header 'X-API-Key: ' ``` # GET /v1/uptime/monitors Source: https://docs.getbluejay.ai/api-reference/endpoint/list-uptime-monitors GET https://api.getbluejay.ai/v1/uptime/monitors List uptime monitors. Returns the uptime monitors in your organization.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/uptime/monitors \ --header 'X-API-Key: ' ``` # GET /v1/widgets Source: https://docs.getbluejay.ai/api-reference/endpoint/list-widgets GET https://api.getbluejay.ai/v1/widgets List widgets. Returns widgets with their metrics, newest first. Filter with `data_type`.## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/widgets \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "", "organization_id": "", "name": "", "description": "", "chart_type": "", "chart_mode": "", "data_type": "", "applies_to_all_agents": true, "bar_mode": "", "aggregation": [ "" ], "time_bucket": "", "group_by": "", "simulation_ids": [ 123 ], "show_indeterminate": true, "filters": null, "column_visibility": null, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "created_by": "", "created_at": "", "updated_at": "", "widget_metrics": [], "layout": { "x": 123, "y": 123, "w": 123, "h": 123 } } ] ``` # PUT /v1/folders/move-agent Source: https://docs.getbluejay.ai/api-reference/endpoint/move-agent-to-folder PUT https://api.getbluejay.ai/v1/folders/move-agent Move an agent into a folder. Moves an agent into a folder. Send no folder to remove the agent from its folder.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/folders/move-agent \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": 123, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agent_id": 123, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "status": "success" } ``` # GET /v1/phone-numbers Source: https://docs.getbluejay.ai/api-reference/endpoint/phone-numbers GET https://api.getbluejay.ai/v1/phone-numbers List your phone numbers. Returns the phone numbers in your organization.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/phone-numbers \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": 123, "created_at": "2026-01-01T00:00:00Z", "phone_number": "", "purchase_date": "2026-01-01", "price": 123, "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ] ``` # POST /v1/agents/{agent_id}/versions/promote Source: https://docs.getbluejay.ai/api-reference/endpoint/promote-prompt POST https://api.getbluejay.ai/v1/agents/{agent_id}/versions/promote Promote an agent version to production. Moves the `production` label to the latest version, or to the version in `version`. `prompt_id` is a deprecated alias for the version UUID. It is ignored when `version` is set.`POST /v1/agents/{agent_id}/prompts/promote` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/promote \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_text": "", "commit_message": "", "labels": [ "" ], "metadata": {}, "version": 123, "agent_id": 123 } ``` # GET /v1/bluejay-as-code/{root_type}/{root_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/pull-bluejay-as-code GET https://api.getbluejay.ai/v1/bluejay-as-code/{root_type}/{root_id} Export your setup as YAML. > [!WARNING] > > [JSON will be deprecated](/bluejay-as-code/overview#move-from-json-to-yaml) on November 20th, 2026.Exports a bundle with these lists:- `agents` - `simulations` - `digital_humans` - `custom_metrics`Each item has a `bluejay_as_code_id`.Supported values for `root_type` include:- `simulation` - `agent` - `digital-human` - `custom-metric``root_id` is the Bluejay ID or the `bluejay_as_code_id` of the root.Commit the `bluejay_as_code_id` values to your config. Do not create new values for each push.The response is YAML. To get JSON until it is deprecated, add the query parameter `format=json` or send the header `Accept: application/json`.```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl "https://api.getbluejay.ai/v1/bluejay-as-code/simulation/$SIM_ID" \ --header "X-API-Key: $BLUEJAY_API_KEY" \ --output simulation.yaml ```## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/bluejay-as-code/{root_type}/{root_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agents": [ {} ], "simulations": [ {} ], "digital_humans": [ {} ], "custom_metrics": [ {} ] } ``` # POST /v1/bluejay-as-code Source: https://docs.getbluejay.ai/api-reference/endpoint/push-bluejay-as-code POST https://api.getbluejay.ai/v1/bluejay-as-code Apply your setup from YAML. > [!WARNING] > > [JSON will be deprecated](/bluejay-as-code/overview#move-from-json-to-yaml) on November 20th, 2026.Applies a bundle. Bluejay matches each item by `bluejay_as_code_id`:- No match: Bluejay creates the item. - Match with changed fields: Bluejay updates the item. - Match with the same fields: no change.Digital Humans that are not in the bundle are unlinked from the simulation. Custom metrics that are not in the bundle are unlinked from the agent. The response lists each action as text.> [!WARNING] > > If you generate new `bluejay_as_code_id` values for each push, Bluejay creates duplicate items. Keep the values stable in your config.Bluejay reads the body as YAML when `Content-Type` is one of these types:- `application/yaml` - `application/x-yaml` - `text/yaml` - `text/x-yaml`Any other `Content-Type` is read as JSON. Unreadable YAML, or YAML with anchors and aliases (`&`, `*`), returns HTTP `400`.Use `--data-binary`, since `--data` strips the line breaks YAML needs:```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/bluejay-as-code \ --header "X-API-Key: $BLUEJAY_API_KEY" \ --header "Content-Type: application/yaml" \ --data-binary @simulation.yaml ```## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/bluejay-as-code \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agents": [ {} ], "simulations": [ {} ], "digital_humans": [ {} ], "custom_metrics": [ {} ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "valid": true, "errors": [ { "entity_type": "", "entity_id": null, "errors": [ "" ] } ], "actions": [], "simulation_id": 123 } ``` # POST /v1/queue-http-text-simulation-run Source: https://docs.getbluejay.ai/api-reference/endpoint/queue-http-text-simulation-run POST https://api.getbluejay.ai/v1/queue-http-text-simulation-run Run an HTTP text simulation. Starts a text run for an HTTP agent and returns `simulation_run_id` and `simulation_result_ids`.1) Queue the run with this endpoint. 2) Receive each Digital Human message at the webhook in the agent settings. 3) Send each agent reply with [Send HTTP Text Message](/api-reference/endpoint/send-http-text-message).If you omit `digital_human_ids`, all Digital Humans in the simulation run. `knowledge_base_id` is ignored. `prompt_id` is deprecated. Use `agent_version_id`.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/queue-http-text-simulation-run \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_id": "", "prompt_id": "", "agent_version_id": "", "knowledge_base_id": "", "digital_human_ids": [ "" ], "runs_per_digital_human": 123 }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_run_id": "", "simulation_result_ids": [ "" ], "agent_id": "", "status": "success" } ``` # POST /v1/queue-simulation-run Source: https://docs.getbluejay.ai/api-reference/endpoint/queue-simulation-run POST https://api.getbluejay.ai/v1/queue-simulation-run Run a voice simulation. Queues a run of a simulation and returns the run ID. The calls run after the response. Poll [Retrieve Simulation Results](/api-reference/endpoint/retrieve-simulation-results) for results.- Send `simulation_id`, or the `bluejay_as_code_id` of the simulation. - If you omit `digital_human_ids`, all Digital Humans in the simulation run. - `phone_number`, `sip_uri`, and the provider agent IDs override the agent values for this run only. - `prompt_id` is deprecated. Use `agent_version_id`. If you send both and they differ, the response is 400. - `ci` tags the run with the pipeline that queued it. See [CI/CD](/api-reference/ci-cd).## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/queue-simulation-run \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "digital_human_ids": [ "" ], "phone_number": "", "sip_uri": "", "livekit_agent_name": "", "livekit_metadata": {}, "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "runs_per_digital_human": 123, "ci": { "provider": "", "repository": "", "commit_sha": "", "branch": "", "pull_request": "", "pipeline_run_url": "https://example.com" } }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_run_id": "", "simulation_result_ids": [ "" ], "agent_id": "", "status": "success", "run_url": "" } ``` # POST /v1/queue-sms-simulation-run Source: https://docs.getbluejay.ai/api-reference/endpoint/queue-sms-simulation-run POST https://api.getbluejay.ai/v1/queue-sms-simulation-run Run an SMS simulation. Queues an SMS run of a simulation.- If `terminate_overlapping_simulations` is `true`, Bluejay ends running conversations that use the same pair of phone numbers. - `runs_per_digital_human` overrides the simulation setting for this run. The default is 1. - `prompt_id` is deprecated. Use `agent_version_id`. If you send both and they differ, the response is 400.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/queue-sms-simulation-run \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_id": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "digital_human_ids": [ "" ], "terminate_overlapping_simulations": false, "runs_per_digital_human": 123 }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_run_id": "", "simulation_result_ids": [ "" ], "agent_id": "", "status": "success", "terminated_conversations": [ {} ] } ``` # POST /v1/re-evaluate/{conversation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/re-evaluate POST https://api.getbluejay.ai/v1/re-evaluate/{conversation_id} Score a conversation again. Creates a new evaluation for a conversation.The JSON body is optional. Send `{"version": 3}` to score against agent version 3. Omit the body, or send `{}`, to keep the version stored on the conversation. An unknown version returns 400.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/re-evaluate/{conversation_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "status": "", "call_id": "", "message": "" } ``` # DELETE /v1/metrics-lab/lab/{lab_id}/conversations Source: https://docs.getbluejay.ai/api-reference/endpoint/remove-conversations-from-lab DELETE https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/conversations Remove conversations from a lab. Removes conversations from a lab. The conversations are not deleted.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/conversations \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "lab_id": "", "conversations": [ { "call_id": "", "test_result_id": 123 } ] }' ``` # POST /v1/simulation/{simulation_id}/remove-digital-humans Source: https://docs.getbluejay.ai/api-reference/endpoint/remove-digital-humans-from-simulation POST https://api.getbluejay.ai/v1/simulation/{simulation_id}/remove-digital-humans Remove Digital Humans from a simulation. Unlinks Digital Humans from a simulation. The Digital Humans are not deleted. An ID that is not linked is ignored.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/simulation/{simulation_id}/remove-digital-humans \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "digital_human_ids": [ 123 ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "message": "" } ``` # DELETE /v1/agents/{agent_id}/versions/{version}/labels Source: https://docs.getbluejay.ai/api-reference/endpoint/remove-prompt-version-labels DELETE https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version}/labels Remove labels from an agent version. Removes labels from one agent version.`DELETE /v1/agents/{agent_id}/prompts/versions/{version}/labels` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request DELETE \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/versions/{version}/labels \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "labels": [], "override_label": false }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "labels": [ "" ] } ``` # PUT /v1/scim/Users/{scim_user_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/replace-scim-user PUT /v1/scim/Users/{scim_user_id} Replace a provisioned person. > [!NOTE] > > SCIM endpoints authenticate with a SCIM token from **Settings → Security → User provisioning (SCIM)**, sent as `Authorization: Bearer `. A Bluejay API key does not work here. Identity providers like Okta and Entra call these for you; see [SSO and User Provisioning](/administration/sso-and-provisioning). # POST /v1/uptime/monitors/{monitor_id}/checks/{check_id}/resolve Source: https://docs.getbluejay.ai/api-reference/endpoint/resolve-uptime-check POST https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/checks/{check_id}/resolve Resolve an uptime check. Resolves one DOWN check. Other incidents stay open.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/checks/{check_id}/resolve \ --header 'X-API-Key: ' ``` # POST /v1/uptime/monitors/{monitor_id}/incidents/resolve Source: https://docs.getbluejay.ai/api-reference/endpoint/resolve-uptime-incidents POST https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/incidents/resolve Resolve the incidents of an uptime monitor. Resolves every unresolved DOWN check of a monitor.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/incidents/resolve \ --header 'X-API-Key: ' ``` # GET /v1/retrieve-call-log/{call_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/retrieve-call-log GET https://api.getbluejay.ai/v1/retrieve-call-log/{call_id} Get a call log. Returns one call log and its evaluations. `credits_used` is the credits that the call used. It is `null` until usage is recorded and priced.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/retrieve-call-log/{call_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "call_log": { "id": "", "agent_id": "", "external_agent_id": "", "recording_url": "", "start_time_utc": "", "participants": [ { "role": "AGENT", "spoke_first": true, "name": "", "phone_number": "" } ], "call_direction": "INBOUND", "interface": "PHONE", "status": "INITIALIZING", "created_at": "2026-01-01T00:00:00Z", "transcript_url": "", "tool_calls": [ { "name": "", "start_offset_ms": 123, "description": "", "parameters": {}, "output": null } ], "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "tags": [ "" ], "duration_ms": 0, "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": 1.5 }, "custom_metrics": [ { "name": null, "description": null, "response_type": null, "response_value": null, "reasoning": null, "min_value": null, "max_value": null, "category": null, "tags": null, "scoring_guidance": null, "enum_options": null, "human_edited": null, "human_response_value": null, "human_reasoning": null, "override_reason_code": null, "override_notes": null, "last_edited_by": null, "last_edited_at": null } ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "metrics": [ { "metric_name": "", "metric_type": "", "value": "", "human_edited": false, "reasoning": "" } ], "annotations": [ null ], "metadata": {}, "custom_metrics": [ null ], "conversation_ended_by": "AGENT" }, "credits_used": 1.5, "status": "200" } ``` # GET /v1/retrieve-call-logs/{agent_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/retrieve-call-logs GET https://api.getbluejay.ai/v1/retrieve-call-logs/{agent_id} List the call logs of an agent. > [!WARNING] > > This endpoint is deprecated. Use [List Conversations](/api-reference/endpoint/list-conversations) with `agent_ids`.Returns call logs for one agent, with evaluations.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/retrieve-call-logs/{agent_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "call_logs": [ { "id": "", "agent_id": "", "external_agent_id": "", "recording_url": "", "start_time_utc": "", "participants": [ { "role": "AGENT", "spoke_first": true, "name": "", "phone_number": "" } ], "call_direction": "INBOUND", "interface": "PHONE", "status": "INITIALIZING", "created_at": "2026-01-01T00:00:00Z", "transcript_url": "", "tool_calls": [ { "name": "", "start_offset_ms": 123, "description": "", "parameters": {}, "output": null } ], "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ null ], "metadata": {} } ], "tags": [ "" ], "duration_ms": 0, "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": null }, "custom_metrics": [ {} ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "metrics": [ { "metric_name": "", "metric_type": "", "value": "", "human_edited": false, "reasoning": "" } ], "annotations": [ null ], "metadata": {}, "custom_metrics": [ null ], "conversation_ended_by": "AGENT" } ], "total_count": 123, "page": 123, "page_size": 123, "total_pages": 123 } ``` # GET /v1/retrieve-simulation-result/{test_result_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/retrieve-simulation-result GET https://api.getbluejay.ai/v1/retrieve-simulation-result/{test_result_id} Get a simulation result. Returns one simulation result and its custom metric results. `simulation_result.status` is one of the [call statuses](/test/simulations/reference#call-statuses).`goal_success` is true only when every success-criteria bullet passed. For the grade of each bullet, use [Retrieve Simulation Result v2](/api-reference/endpoint/retrieve-simulation-result-v2).## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/retrieve-simulation-result/{test_result_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_result": { "id": 123, "digital_human_id": 123, "result": {}, "duration": 123, "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "custom_metrics": {}, "status": "", "latency": {}, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "transcript": [ {} ], "transcript_url": "", "audio_url": "", "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": 1.5 }, "custom_metrics": [ { "name": null, "description": null, "response_type": null, "response_value": null, "reasoning": null, "min_value": null, "max_value": null, "category": null, "tags": null, "scoring_guidance": null, "enum_options": null, "human_edited": null, "human_response_value": null, "human_reasoning": null, "override_reason_code": null, "override_notes": null, "last_edited_by": null, "last_edited_at": null } ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "tool_calls": [ { "name": "", "expected": [ { "parameters": {}, "output": null } ], "actual": [ { "parameters": {}, "output": null, "start_offset_ms": null } ] } ], "trace_ids": [ "" ], "metrics": [ { "metric_id": "", "name": "", "type": "", "value": null, "not_applicable": false, "reasoning": "" } ] }, "credits_used": 1.5, "status": "200" } ``` # GET /v2/retrieve-simulation-result/{test_result_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/retrieve-simulation-result-v2 GET https://api.getbluejay.ai/v2/retrieve-simulation-result/{test_result_id} Get one result with the grade of each success-criteria bullet. Returns the same result as [the `/v1` endpoint](/api-reference/endpoint/retrieve-simulation-result), with its success criteria graded one bullet at a time. `criteria_pass_rate` is the share of bullets that passed, from 0 to 100, and the result passes only when every bullet passed.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v2/retrieve-simulation-result/{test_result_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_result": { "id": 123, "digital_human_id": 123, "result": {}, "duration": 123, "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "custom_metrics": {}, "status": "", "latency": {}, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "transcript": [ {} ], "transcript_url": "", "audio_url": "", "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "success_criteria_results": [ null ], "criteria_pass_rate": 1.5, "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": 1.5 }, "custom_metrics": [ { "name": null, "description": null, "response_type": null, "response_value": null, "reasoning": null, "min_value": null, "max_value": null, "category": null, "tags": null, "scoring_guidance": null, "enum_options": null, "human_edited": null, "human_response_value": null, "human_reasoning": null, "override_reason_code": null, "override_notes": null, "last_edited_by": null, "last_edited_at": null } ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "tool_calls": [ { "name": "", "expected": [ { "parameters": {}, "output": null } ], "actual": [ { "parameters": {}, "output": null, "start_offset_ms": null } ] } ], "trace_ids": [ "" ], "metrics": [ { "metric_id": "", "name": "", "type": "", "value": null, "not_applicable": false, "reasoning": "" } ], "criteria_pass_rate": 1.5, "criteria": [ { "id": "", "text": "", "passed": true, "reasoning": "" } ] }, "credits_used": 1.5, "status": "200" } ``` # GET /v1/retrieve-simulation-results/{simulation_run_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/retrieve-simulation-results GET https://api.getbluejay.ai/v1/retrieve-simulation-results/{simulation_run_id} List the results of a simulation run. Returns a simulation run and one page of its results, oldest first. Each result includes evaluations and custom metric results. A result's `status` is one of the [call statuses](/test/simulations/reference#call-statuses).`limit` is 100 by default and 100 at most. Use `offset` to get the next page. Use `issue_ids` to keep only results linked to those simulation issues.`goal_success` is true only when every success-criteria bullet passed. For the grade of each bullet, use [Retrieve Simulation Results v2](/api-reference/endpoint/retrieve-simulation-results-v2).## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v1/retrieve-simulation-results/{simulation_run_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_run": { "id": "", "simulation_id": "", "summary": "", "status": "RUNNING", "total_tests": 123, "tests_passed": 123, "tests_failed": 123, "tests_completed": 123, "success_rate": 1.5, "created_at": "2026-01-01T00:00:00Z", "run_url": "", "eval_failed": 123 }, "simulation_results": [ { "id": 123, "digital_human_id": 123, "result": {}, "duration": 123, "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "custom_metrics": {}, "status": "", "latency": {}, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ null ], "metadata": {} } ], "transcript": [ {} ], "transcript_url": "", "audio_url": "", "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": null }, "custom_metrics": [ {} ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "tool_calls": [ { "name": "", "expected": [ {} ], "actual": [ {} ] } ], "trace_ids": [ "" ], "metrics": [ { "metric_id": "", "name": "", "type": "", "value": null, "max_value": 123, "not_applicable": false, "reasoning": "" } ] } ], "status": "200" } ``` # GET /v2/retrieve-simulation-results/{simulation_run_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/retrieve-simulation-results-v2 GET https://api.getbluejay.ai/v2/retrieve-simulation-results/{simulation_run_id} List a run's results with the grade of each success-criteria bullet. Returns the same run and page of results as [the `/v1` endpoint](/api-reference/endpoint/retrieve-simulation-results), with each result's success criteria graded one bullet at a time. Query parameters are the same.A result passes only when every bullet passed. `tests_passed`, `eval_failed` and `success_rate` on the run count results that way, and `criteria_pass_rate` on each result is the share of its bullets that passed, from 0 to 100.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request GET \ --url https://api.getbluejay.ai/v2/retrieve-simulation-results/{simulation_run_id} \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_run": { "id": "", "simulation_id": "", "summary": "", "status": "RUNNING", "total_tests": 123, "tests_passed": 123, "tests_failed": 123, "tests_completed": 123, "success_rate": 1.5, "created_at": "2026-01-01T00:00:00Z", "run_url": "", "eval_failed": 123 }, "simulation_results": [ { "id": 123, "digital_human_id": 123, "result": {}, "duration": 123, "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "custom_metrics": {}, "status": "", "latency": {}, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ null ], "metadata": {} } ], "transcript": [ {} ], "transcript_url": "", "audio_url": "", "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "success_criteria_results": [ null ], "criteria_pass_rate": 1.5, "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": null }, "custom_metrics": [ {} ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "tool_calls": [ { "name": "", "expected": [ {} ], "actual": [ {} ] } ], "trace_ids": [ "" ], "metrics": [ { "metric_id": "", "name": "", "type": "", "value": null, "max_value": 123, "not_applicable": false, "reasoning": "" } ], "criteria_pass_rate": 1.5, "criteria": [ { "id": "", "text": "", "passed": true, "reasoning": "" } ] } ], "status": "200" } ``` # POST /v1/send-http-text-message Source: https://docs.getbluejay.ai/api-reference/endpoint/send-http-text-message POST https://api.getbluejay.ai/v1/send-http-text-message Reply in an HTTP text simulation. Sends one agent turn into a running HTTP text simulation. The Digital Human reply goes to the webhook in the agent settings.## Fields| Field | Type | Description | | - | - | - | | simulation\_result\_id | string | Required. The simulation result to send to. | | `type` | string | `message` (default) or `tool_call`. | | `message` | string | Required when `type` is `message`. The agent text. | | `name` | string | Required when `type` is `tool_call`. The tool name. | | `parameters` | object | Tool parameters. | | `output` | any | Tool output. | | `end_turn` | boolean | Default `true`. If `false`, Bluejay holds the message and waits for more. | | end\_conversation | boolean | Default `false`. If `true`, Bluejay ends and evaluates the conversation. | | `message_id` | string | Unique ID. Bluejay drops a repeated ID in the same conversation. |## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/send-http-text-message \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_result_id": "", "end_conversation": false, "end_turn": true, "message_id": "", "type": "message", "message": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulation_result_id": "", "status": "success", "end_conversation": false } ``` # PUT /v1/metrics-lab/lab/{lab_id}/human-evaluation Source: https://docs.getbluejay.ai/api-reference/endpoint/set-human-evaluation PUT https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/human-evaluation Label a lab metric result yourself. Creates or updates the human label for one metric on one conversation. Send `call_id` for a production call or `test_result_id` for a simulation result.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/human-evaluation \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "custom_metric_id": "", "call_id": "", "test_result_id": 123, "human_response_value": "", "human_reasoning": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "success": true, "message": "" } ``` # PUT /v1/simulations/{simulation_id}/personalities Source: https://docs.getbluejay.ai/api-reference/endpoint/set-simulation-personalities PUT https://api.getbluejay.ai/v1/simulations/{simulation_id}/personalities Set the personalities of a simulation. Replaces the personality selection of a simulation. Each run then queues one conversation per Digital Human per selected personality. With an empty `personality_ids`, each Digital Human runs once, as itself.Rate limit: 60 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is a list. Each item has these fields: \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/simulations/{simulation_id}/personalities \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "personality_ids": [ "" ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "language": "", "accent": "", "gender": "", "background_noise": "", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ] ``` # POST /v1/red-team-simulations Source: https://docs.getbluejay.ai/api-reference/endpoint/start-red-team-simulation POST https://api.getbluejay.ai/v1/red-team-simulations Start a Red Teaming run. Starts a red team test against an agent. Each attack is a real voice call.## Confirm the test1) Send the request without `confirmed`. The response has `needs_confirmation: true` and a `preview` text. Nothing runs. 2) Send the same request with `confirmed: true`. The response has `test_id`, `simulation_id`, and `simulation_run_id`.## Limits| Setting | Default | Maximum | | - | - | - | | `max_levels` | 5 | 5 (24 with attack\_quotas) | | max\_branches\_per\_node | 3 | 3 (20 with attack\_quotas) | | max\_total\_dhs | 16 | 16 (83 with attack\_quotas) | | max\_call\_duration\_minutes | 10 | 10 | | `recon_count` | 3 | max\_total\_dhs |Send these settings inside `config`. Values above the maximum are lowered to the maximum. Each family in `attack_quotas` allows 20 attempts at most.## Errors- 400: the agent uses SMS. - 402 with code `RED_TEAMING_PAYMENT_METHOD_REQUIRED`: the organization has no payment method. - 403 with code `red_team_custom_matrix_not_allowed`: `attack_quotas` needs a Growth plan or higher. Check with [Get Red Team Entitlements](/api-reference/endpoint/get-red-team-entitlements).Rate limit: 30 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/red-team-simulations \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": 123, "config": {}, "confirmed": false }' ``` # POST /v1/self-improve/runs Source: https://docs.getbluejay.ai/api-reference/endpoint/start-self-improve-run POST https://api.getbluejay.ai/v1/self-improve/runs Start a Self-Improve run. Starts a loop that changes the agent prompt, pushes it to the provider, and runs the simulation to score it. At the end, Bluejay saves the best prompt as one new `latest` version. The previous version stays. The `production` label does not move.## Confirm the run1) Send the request without `confirmed`. The response has `needs_confirmation: true` and a `preview` text. Nothing runs. 2) Send the same request with `confirmed: true`. The response has `run_id`.## Limits- The agent must be a Vapi, ElevenLabs, or Retell agent with a provider ID. Other agents return 400. - `max_iterations` is 5 by default and 20 at most. - `metric_count` is 5 by default and 20 at most. - One agent can have one active run. A second run returns 409.Rate limit: 30 requests per minute.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/self-improve/runs \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": 123, "simulation_id": 123, "target_pass_rate": 0.9, "max_iterations": 5, "min_improvement": 0.02, "metric_count": 5, "success_metric_ids": [ "" ], "confirmed": false }' ``` # POST /v1/red-team-simulations/{test_id}/stop Source: https://docs.getbluejay.ai/api-reference/endpoint/stop-red-team-simulation POST https://api.getbluejay.ai/v1/red-team-simulations/{test_id}/stop Stop a Red Teaming run. Stops a red team test. Bluejay ends its live calls and returns their IDs in `ended_conversations`. A test that is already complete, stopped, or failed keeps its status.Rate limit: 30 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/red-team-simulations/{test_id}/stop \ --header 'X-API-Key: ' ``` # POST /v1/self-improve/runs/{run_id}/stop Source: https://docs.getbluejay.ai/api-reference/endpoint/stop-self-improve-run POST https://api.getbluejay.ai/v1/self-improve/runs/{run_id}/stop Stop a Self-Improve run. Requests a stop and returns `STOP_REQUESTED`. If the run is not pending or running, the response returns the current status and does not change it.Rate limit: 30 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/self-improve/runs/{run_id}/stop \ --header 'X-API-Key: ' ``` # POST /v1/agents/{agent_id}/workflow/sync Source: https://docs.getbluejay.ai/api-reference/endpoint/sync-agent-workflow POST https://api.getbluejay.ai/v1/agents/{agent_id}/workflow/sync Sync the workflow of an agent. Pulls the latest [workflow](/test/simulations/reference#workflow) of one agent from its provider. This replaces the Bluejay edits that you did not push.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Query parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/workflow/sync \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # POST /v1/integrations/amelia/sync Source: https://docs.getbluejay.ai/api-reference/endpoint/sync-amelia-agents POST https://api.getbluejay.ai/v1/integrations/amelia/sync Import your Amelia agents. Imports each Amelia AI agent that the [Amelia integration](/integrations/amelia) account can see. Bluejay makes one agent for each, and refreshes the agents that it already tracks.## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseThe response is `object`.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/integrations/amelia/sync \ --header 'X-API-Key: ' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} {} ``` # POST /v1/translate-transcript Source: https://docs.getbluejay.ai/api-reference/endpoint/translate-transcript POST https://api.getbluejay.ai/v1/translate-transcript Translate a transcript. Translates a transcript. Send `simulation_result_id` for a simulation, or `conversation_id` for a production call. `target_language` is a language code such as `es`. The default is `en`.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/translate-transcript \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_result_id": 123, "target_language": "en" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "translated_transcript_url": "", "target_language": "", "success": true } ``` # POST /v1/uptime/monitors/{monitor_id}/checks/{check_id}/unresolve Source: https://docs.getbluejay.ai/api-reference/endpoint/unresolve-uptime-check POST https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/checks/{check_id}/unresolve Reopen an uptime check. Opens a resolved DOWN check again.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id}/checks/{check_id}/unresolve \ --header 'X-API-Key: ' ``` # POST /v1/update-agent Source: https://docs.getbluejay.ai/api-reference/endpoint/update-agent POST https://api.getbluejay.ai/v1/update-agent Update an agent. Updates an agent by `agent_id`. Fields you do not send keep their stored values.If you send `connection_type`, Bluejay clears the connection fields that the new type does not use. [Fields by connection type](/api-reference/endpoint/add-agent#fields-by-connection-type) lists the fields of each type.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/update-agent \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": "", "external_agent_id": "", "name": "", "system_prompt": "", "phone_number": "", "goals": [ "" ], "type": "INBOUND", "connection_type": "SMS", "mode": "VOICE", "keyterms": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "folder": "", "websocket_url": "", "websocket_username": "", "websocket_password": "", "sip_uri": "", "sip_username": "", "sip_password": "", "custom_sip_headers": { "key": "" }, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "redact_pii": true, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_sync_reply": true, "voice_provider": "", "provider_id": "", "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "email_address": "", "email_reply_addresses": [ "" ], "bland_pathway_id": "", "bland_agent_id": "", "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "bland_call_settings": {}, "provider_request_data": {}, "enable_outbound_call_auto_start": true, "simulations_disabled": true, "workflow": {}, "provider": "CUSTOM" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agent": { "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": "", "external_agent_id": "", "name": "", "system_prompt": "", "phone_number": "", "goals": [ "" ], "type": "INBOUND", "connection_type": "SMS", "mode": "VOICE", "keyterms": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "folder": "", "websocket_url": "", "websocket_username": "", "websocket_password": "", "sip_uri": "", "sip_username": "", "sip_password": "", "custom_sip_headers": { "key": "" }, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "redact_pii": true, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_sync_reply": true, "voice_provider": "", "provider_id": "", "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "email_address": "", "email_reply_addresses": [ "" ], "bland_pathway_id": "", "bland_agent_id": "", "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "bland_call_settings": {}, "provider_request_data": {}, "enable_outbound_call_auto_start": true, "simulations_disabled": true, "workflow": {}, "provider": "CUSTOM" }, "status": "200", "http_webhook_key": "" } ``` # PUT /v1/update-agent-by-external-id Source: https://docs.getbluejay.ai/api-reference/endpoint/update-agent-by-external-id PUT https://api.getbluejay.ai/v1/update-agent-by-external-id Update an agent by external ID. Updates an agent by `external_agent_id`, the ID of the agent at your voice provider. Fields you do not send keep their stored values.If you send `connection_type`, Bluejay clears the connection fields that the new type does not use. [Fields by connection type](/api-reference/endpoint/add-agent#fields-by-connection-type) lists the fields of each type.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-agent-by-external-id \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "external_agent_id": "", "name": "", "system_prompt": "", "phone_number": "", "goals": [ "" ], "type": "INBOUND", "connection_type": "SMS", "mode": "VOICE", "keyterms": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "folder": "", "websocket_url": "", "websocket_username": "", "websocket_password": "", "sip_uri": "", "sip_username": "", "sip_password": "", "custom_sip_headers": { "key": "" }, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "redact_pii": true, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_sync_reply": true, "voice_provider": "", "provider_id": "", "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "email_address": "", "email_reply_addresses": [ "" ], "bland_pathway_id": "", "bland_agent_id": "", "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "bland_call_settings": {}, "provider_request_data": {}, "enable_outbound_call_auto_start": true, "simulations_disabled": true, "workflow": {}, "provider": "CUSTOM" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agent": { "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": "", "external_agent_id": "", "name": "", "system_prompt": "", "phone_number": "", "goals": [ "" ], "type": "INBOUND", "connection_type": "SMS", "mode": "VOICE", "keyterms": [ "" ], "follow_up_sms_sender_numbers": [ "" ], "folder": "", "websocket_url": "", "websocket_username": "", "websocket_password": "", "sip_uri": "", "sip_username": "", "sip_password": "", "custom_sip_headers": { "key": "" }, "dynamic_sip_webhook_url": "", "outbound_trigger_webhook_url": "", "outbound_trigger_payload_template": {}, "redact_pii": true, "livekit_agent_name": "", "livekit_metadata": {}, "livekit_customer_tool_topic": "", "livekit_token_webhook_url": "", "livekit_token_webhook_auth": "", "pipecat_agent_name": "", "pipecat_agent_configuration": {}, "pipecat_room_properties": {}, "http_webhook": "", "http_webhook_sync_reply": true, "voice_provider": "", "provider_id": "", "eleven_labs_agent_id": "", "retell_agent_id": "", "vapi_assistant_id": "", "ces_app_id": "", "ces_deployment_id": "", "dfcx_project_id": "", "dfcx_location": "", "dfcx_agent_id": "", "amelia_base_url": "", "amelia_domain_code": "", "amelia_flow_name": "", "amelia_agent_name": "", "kore_host": "", "kore_bot_id": "", "kore_client_id": "", "kore_client_secret": "", "openai_base_url": "", "openai_api_key": "", "openai_model": "", "openai_realtime_url": "", "openai_realtime_session": {}, "openai_prompt_id": "", "openai_prompt_version": "", "email_address": "", "email_reply_addresses": [ "" ], "bland_pathway_id": "", "bland_agent_id": "", "sierra_agent_token": "", "sierra_release": "", "sierra_agent_parameters": {}, "bland_call_settings": {}, "provider_request_data": {}, "enable_outbound_call_auto_start": true, "simulations_disabled": true, "workflow": {}, "provider": "CUSTOM" }, "status": "200", "http_webhook_key": "" } ``` # PUT /v1/update-alert/{alert_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-alert PUT https://api.getbluejay.ai/v1/update-alert/{alert_id} Update an alert. Updates an alert. A field you do not send does not change. Send `simulation_id` as `null` to apply the alert to all simulations of the agent.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-alert/{alert_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "sample_size": 123, "name": "", "description": "", "is_enabled": true, "entity_type": "standard_metric", "entity_field": "", "operator": "equals", "comparison_value": "", "notification_channels": [ { "type": "", "target": "" } ], "applies_to_all_agents": true, "agent_ids": [ 123 ], "simulation_id": 123, "evaluation_scope": "per_test_result", "aggregation": "none", "threshold_time_interval": 123, "min_events": 123, "min_events_type": "events", "source_scope": "all" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "name": "", "description": "", "is_enabled": true, "organization_id": "", "entity_type": "standard_metric", "entity_field": "", "operator": "equals", "comparison_value": "", "notification_channels": [ null ], "last_triggered_at": "2026-01-01T00:00:00Z", "trigger_count": 123, "created_by": "", "applies_to_all_agents": true, "agents": [ 123 ], "simulation_id": 123, "evaluation_scope": "", "aggregation": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "threshold_time_interval": 123, "min_events": 123, "min_events_type": "events", "in_alert": true, "source_scope": "all", "simulation_name": "", "sample_size": 123 } ``` # PUT /v1/update-community/{community_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-community PUT https://api.getbluejay.ai/v1/update-community/{community_id} Update a community. Updates a community. Only the fields you send change. `digital_human_ids` replaces the current members. To add members and keep the current ones, use [Add Digital Humans to Community](/api-reference/endpoint/add-to-community).## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-community/{community_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "title": "", "description": "", "digital_human_ids": [ 123 ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "title": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "digital_human_ids": [ 123 ] } ``` # PATCH /v1/custom-background-noises/{noise_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-custom-background-noise PATCH https://api.getbluejay.ai/v1/custom-background-noises/{noise_id} Update a custom background noise. Renames a custom background noise. `storage_path` cannot change.Rate limit: 30 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PATCH \ --url https://api.getbluejay.ai/v1/custom-background-noises/{noise_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "storage_path": "", "created_at": "", "created_by": "", "usage_count": 123 } ``` # PUT /v1/update-metric/{metric_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-custom-metric PUT https://api.getbluejay.ai/v1/update-metric/{metric_id} Update a custom metric. Updates one custom metric.`PUT /v1/update-custom-metric/{metric_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-metric/{metric_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "bluejay_as_code_id": "", "name": "", "prompt": "", "summary": "", "metric_type": "", "settings": {}, "eval_segment": "agent", "scope": "observability", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": true }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "bluejay_as_code_id": "", "name": "", "prompt": "", "description": "", "summary": "", "metric_type": "llm_judge", "eval_method": "llm_judge", "settings": {}, "eval_segment": "all", "scope": "all", "response_type": "pass_fail", "agent_ids": [ 123 ], "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "", "created_by": "", "eval_modality": "AUDIO", "model": "", "audio_model": "", "temperature": 1.5, "enum_options": [ "" ], "tool_names": [ "" ], "json_schema": {}, "allow_not_applicable": false, "eval_modality_auto_selected": false, "template_id": "" } ``` # PUT /v1/update-metrics Source: https://docs.getbluejay.ai/api-reference/endpoint/update-custom-metrics PUT https://api.getbluejay.ai/v1/update-metrics Update several custom metrics. Applies the same `updates` to each metric in `metric_ids`. Only the keys you send change. A key with `null` is set to null.`PUT /v1/update-custom-metrics` is the deprecated path of this endpoint.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-metrics \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "metric_ids": [ "" ], "updates": { "tags": [ "" ], "agent_ids": [ 123 ], "eval_modality": "AUDIO", "eval_segment": "agent", "scope": "observability", "model": "", "audio_model": "", "temperature": 1.5, "allow_not_applicable": true } }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "success": true, "message": "", "updated": 123 } ``` # PUT /v1/update-customer-persona/{persona_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-customer-persona PUT https://api.getbluejay.ai/v1/update-customer-persona/{persona_id} Update a customer persona. Updates a customer persona. Only the fields you send change.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-customer-persona/{persona_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "", "goal": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "name": "", "description": "", "goal": "", "org_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # PUT /v1/dashboards/{dashboard_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-dashboard PUT https://api.getbluejay.ai/v1/dashboards/{dashboard_id} Update a dashboard. Updates the name or description of a dashboard. An empty `description` clears it.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/dashboards/{dashboard_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "is_curated": false, "created_by": "", "created_at": "", "data_type": "", "agent_id": 123, "url": "" } ``` # PUT /v1/dashboards/{dashboard_id}/layout Source: https://docs.getbluejay.ai/api-reference/endpoint/update-dashboard-layout PUT https://api.getbluejay.ai/v1/dashboards/{dashboard_id}/layout Arrange the widgets on a dashboard. Sets the position and size of widgets on a dashboard. Items for widgets that are not on the dashboard are ignored.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/dashboards/{dashboard_id}/layout \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "layouts": [ { "widget_id": "", "layout": { "x": 123, "y": 123, "w": 123, "h": 123 } } ] }' ``` # PUT /v1/update-digital-human/{digital_human_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-digital-human PUT https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id} Update a Digital Human. Updates a Digital Human. Validation uses the `tag` in the body. If you do not send `tag`, validation uses the stored `tag`.`success_criteria` is one string with a bullet per line. Sending it replaces every bullet.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-digital-human/{digital_human_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "intent": "", "success_criteria": "", "name": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "none", "custom_background_noise_url": "", "voice_speed": "slowest", "audio_quality": "high", "fluency": "beginner", "verbosity": "low", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "simulation_ids": [ 123 ], "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "traits_mode": "replace", "interruptions": { "type": "none" }, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": true, "role_description": "", "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "num_runs": 123, "livekit_metadata": {}, "always_on_mode": true, "always_on_active": true, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "override_conflict": false, "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "attack_vector": "", "attack_type": "", "attack_plan": {} }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "digital_human": { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "intent": "", "success_criteria": "", "tag": "", "tags": [ "" ], "type": "voicemail_custom", "system_prompt_rule_ids": [ "" ], "system_prompt_rule_quotes": [ "" ], "name": "", "language": "en", "accent": "multilingual", "gender": "male", "custom_voice_id": "", "background_noise": "", "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "phone_number": "", "extension": "", "outbound_text_number": "", "follow_up_sms_success_criteria": "", "websocket_url": "", "background_noise_volume": 1.5, "expected_tool_calls": [ { "name": "", "parameters": {}, "output": null } ], "allow_end_call_tool": true, "allow_silence_tool": true, "allow_dtmf_tool": true, "default_dtmf_or_voiced": "voiced", "silence_tool_instructions": "default", "endpointing_delay": 1.5, "creativity": 1.5, "hangup_phrases": [ "" ], "hangup_instructions": "", "silence_timeout": 123, "role_description": "", "created_at": "2026-01-01T00:00:00Z", "traits": [ { "trait_name": "", "trait_data_type": "BOOLEAN", "value": null, "is_sip_header": false } ], "interruptions": {}, "scripted_responses": [ { "match_type": "exact", "match_phrase": "", "response_type": "phrase", "response_value": "", "scripted_response_audio_snippet_url": "", "occurrence_mode": "always", "occurrence_n": 123, "silence_duration": 123 } ], "scripted_responses_ordered": false, "speaks_first_config": { "speaks_first": true, "mode": "custom", "message": "", "dynamic": true }, "original_transcript": "", "formatted_transcript": [ { "key": "" } ], "enriched_playback": [ {} ], "workflow_v2_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "workflow_path_index": 123, "tested_path": [ "" ], "livekit_metadata": {}, "test_name": "", "journey_steps": [ { "step": 123, "intent": "", "success_criteria": "", "modality": "voice", "direction": "inbound", "wait_seconds": 123, "response_window_seconds": 123, "unresponsive": false, "phone_number": "" } ], "always_on_mode": true, "always_on_active": false, "num_runs": 1, "attack_vector": "", "attack_type": "", "attack_plan": {} }, "simulation_ids": [ 123 ], "simulation_id": 123 } ``` # PUT /v1/update-folder/{folder_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-folder PUT https://api.getbluejay.ai/v1/update-folder/{folder_id} Update a folder. Renames a folder.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-folder/{folder_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "organization_id": "", "created_at": "" } ``` # PUT /v1/observability/issues/{issue_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-issue PUT https://api.getbluejay.ai/v1/observability/issues/{issue_id} Update an issue. Updates an issue. A field you do not send does not change. A field you send as `null` is cleared.- `status`: `open`, `in_progress`, `resolved`, or `ignored`. - `priority`: `low`, `medium`, `high`, or `urgent`. It is empty until someone sets it. - `assignee_id`: a user in your organization. - `due_date`: `YYYY-MM-DD`.Bluejay writes the title and the attached calls. You cannot edit them. `PUT /v1/issues/{issue_id}` is the deprecated path of this endpoint.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/observability/issues/{issue_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "status": "", "priority": "", "assignee_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "due_date": "2026-01-01" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "type": "", "title": "", "description": "", "status": "", "priority": "", "assignee_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "due_date": "2026-01-01", "error_source": "", "error_code": "", "error_signature": "", "cluster_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "first_seen_at": "2026-01-01T00:00:00Z", "last_seen_at": "2026-01-01T00:00:00Z", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ``` # PUT /v1/knowledge-base/{knowledge_base_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-knowledge-base PUT https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id} Update a Knowledge Base. Updates a Knowledge Base. Send at least one of `name` and `description`.Rate limit: 60 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/knowledge-base/{knowledge_base_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "", "name": "", "description": "", "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "", "updated_at": "" } ``` # PUT /v1/metrics-lab/lab/{lab_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-lab PUT https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id} Update a Metrics Lab lab. Updates the name or description of a lab.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "name": "", "description": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ``` # PUT /v1/metrics-lab/lab/{lab_id}/settings Source: https://docs.getbluejay.ai/api-reference/endpoint/update-lab-settings PUT https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/settings Update the settings of a lab. Merges the settings you send into the current lab settings. Settings you do not send do not change.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/metrics-lab/lab/{lab_id}/settings \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "fuzzy_alignment": {} }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "success": true, "message": "" } ``` # PUT /v1/agents/{agent_id}/labels/{label_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-label PUT https://api.getbluejay.ai/v1/agents/{agent_id}/labels/{label_id} Update an agent label. Renames a label. Renaming to `production` returns 400. Changing `latest` returns 400.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/agents/{agent_id}/labels/{label_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "label_text": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "agent_id": 123, "label_text": "", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "color": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a" } ``` # PATCH /v1/personalities/{personality_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-personality PATCH https://api.getbluejay.ai/v1/personalities/{personality_id} Update a personality. Updates a personality. Only the fields you send change.Rate limit: 120 requests per minute.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PATCH \ --url https://api.getbluejay.ai/v1/personalities/{personality_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "language": "", "accent": "", "gender": "", "background_noise": "none", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "slowest", "audio_quality": "horrible", "fluency": "beginner", "verbosity": "low", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "name": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "language": "", "accent": "", "gender": "", "background_noise": "", "background_noise_volume": 1.5, "custom_background_noise_url": "", "voice_speed": "", "audio_quality": "", "fluency": "", "verbosity": "", "endpointing_delay": 1.5, "silence_timeout": 123, "temperature": 1.5, "interruption_configs": {}, "role_description": "", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z" } ``` # PUT /v1/scenario/{workflow_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-scenario PUT https://api.getbluejay.ai/v1/scenario/{workflow_id} Update a scenario. Updates a scenario. Fields you do not send do not change.- `agent_ids` replaces all agent links. `[]` removes all links. - `definition` replaces the full graph. Bluejay validates it the same as [Create Scenario](/api-reference/endpoint/create-scenario).## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/scenario/{workflow_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "agent_ids": [ 123 ], "description": "", "definition": {} }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "agent_ids": [], "name": "", "description": "", "definition": {}, "created_at": "2026-01-01T00:00:00Z", "dh_sync_summary": {}, "warnings": [ "" ] } ``` # PUT /v1/update-schedule/{schedule_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-schedule PUT https://api.getbluejay.ai/v1/update-schedule/{schedule_id} Update a schedule. Updates a schedule and returns the updated schedule.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/update-schedule/{schedule_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "timezone": "", "schedule": { "window": { "days": [ "monday" ], "start_time": "", "end_time": "" }, "frequency": "", "interval": 123 }, "enabled": true }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "simulation_id": "", "cron_expression": "", "enabled": true, "created_at": "", "timezone": "" } ``` # PATCH /v1/scim/Users/{scim_user_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-scim-user PATCH /v1/scim/Users/{scim_user_id} Update a provisioned person. > [!NOTE] > > SCIM endpoints authenticate with a SCIM token from **Settings → Security → User provisioning (SCIM)**, sent as `Authorization: Bearer `. A Bluejay API key does not work here. Identity providers like Okta and Entra call these for you; see [SSO and User Provisioning](/administration/sso-and-provisioning). # PUT /v1/simulation/{simulation_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-simulation PUT https://api.getbluejay.ai/v1/simulation/{simulation_id} Update a simulation. Updates a simulation. Only the fields you send change.`prompt_id` is deprecated. Use `agent_version_id`. If you send both and they differ, the response is 400.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/simulation/{simulation_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "name": "", "description": "", "prompt_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "knowledge_base_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "max_concurrent": 123, "hangup_on_transfer": true, "max_call_duration": 123, "max_call_duration_units": "minutes", "max_turns": 123, "ringing_timeout": 123, "digital_humans_settings": {}, "selected_custom_metrics": [ "3c90c3cc-0d44-4b50-8888-8dd25736052a" ], "custom_metrics_failing_threshold": 123, "custom_metrics_passing_threshold": 123, "outcome_failing_threshold": 123, "outcome_passing_threshold": 123, "runs_per_digital_human": 123, "delay_between_tests_seconds": 1.5, "inactivity_timeout_seconds": 123, "tags": [ "" ], "pinned": true, "custom_error_enabled": true, "custom_error_prompt": "", "enable_rerun_failed_test_results": true, "enable_rerun_on_custom_error": true, "rerun_max_retries": 123 }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": 123, "bluejay_as_code_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "agent_id": 123, "name": "", "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "settings": {}, "type": "max_concurrent", "max_concurrent": 123, "max_turns": 123, "ringing_timeout": 123, "inactivity_timeout_seconds": 123, "tags": [ "" ], "description": "", "pinned": true, "always_on": true } ``` # POST /v1/update-simulation-result Source: https://docs.getbluejay.ai/api-reference/endpoint/update-simulation-result POST https://api.getbluejay.ai/v1/update-simulation-result Add data to a simulation result. Adds tool calls, events, tags, metadata, and trace IDs to a simulation result.## Identify the resultSend one of these:- `simulation_result_id`. For SIP calls, read it from the `X-Simulation-Result-Id` header of the call. - `start_time`, `end_time`, and `duration` in seconds.With the time window, Bluejay looks for a connected simulation in the workspaces your key can see. A stored call matches when both times are within 90 seconds and the stored duration is within the larger of 5 seconds and 10% of `duration`. Calls with no stored duration always match.Without `recorded_transcript`, exactly one call must match. With a transcript, Bluejay scores each call that matches:- One call is kept only when the transcript shares at least 80% of its normalized words. - Two or more calls are separated only when the best score leads the next score by at least 0.08.## Errors- 404: nothing in your organization matched the time window. - 409: the transcript was missing, not stored yet, too close to separate the calls, or not close enough to the only call. Send `simulation_result_id` instead. Nothing is written.## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request POST \ --url https://api.getbluejay.ai/v1/update-simulation-result \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "simulation_result_id": "", "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "duration": 123, "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "tool_calls": [ { "name": "", "start_offset_ms": 123, "description": "", "parameters": {}, "output": null } ], "recorded_transcript": [ { "start_offset_ms": 123, "end_offset_ms": 123, "speaker": "AGENT", "utterance": "", "filler_utterance": true } ], "tags": [ "" ], "metadata": {}, "trace_ids": [ "" ], "session_id": "" }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "status": "success", "message": "" } ``` # PUT /v1/uptime/monitors/{monitor_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-uptime-monitor PUT https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id} Update an uptime monitor. Updates an uptime monitor. Only the fields you send change.- `checks` replaces the full list. Send every check you want to keep. For the shapes, see [Create Uptime Monitor](/api-reference/endpoint/create-uptime-monitor). - A change to `checks` or `agent_id` rebuilds the simulation of the monitor. Notification, pause, and resume changes do not.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## ResponseA `200` response has no body.## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/uptime/monitors/{monitor_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "agent_id": 123, "frequency": "", "active_window": { "days": [ "monday" ], "start_time": "", "end_time": "", "timezone": "" }, "checks": [ {} ], "notifications": {}, "enabled": true, "start_at": "" }' ``` # PUT /v1/widgets/{widget_id} Source: https://docs.getbluejay.ai/api-reference/endpoint/update-widget PUT https://api.getbluejay.ai/v1/widgets/{widget_id} Update a widget. Replaces the full configuration and metrics of a widget. Send every field you want to keep. `data_type` cannot change.## Path parameters \ \ \ \ \
NameTypeRequiredDescription
## Headers \ \ \ \ \
NameTypeRequiredDescription
## Request body \ \ \ \ \
NameTypeRequiredDescription
## Response \ \ \ \ \
NameTypeRequiredDescription
## Status codes| Status | Meaning | | - | - | | `200` | Successful Response | | `422` | Validation Error |## Example request```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl --request PUT \ --url https://api.getbluejay.ai/v1/widgets/{widget_id} \ --header 'X-API-Key: ' \ --header 'Content-Type: application/json' \ --data '{ "name": "", "description": "", "chart_type": "line", "chart_mode": "time_series", "bar_mode": "stacked", "aggregation": [ "count" ], "time_bucket": "hour", "group_by": "agent", "simulation_ids": [ 123 ], "show_indeterminate": false, "filters": [ null ], "column_visibility": { "key": true }, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "metrics": [ { "metric": "", "custom_metric_id": "", "goal": "", "tool_call_id": "", "metadata_path": "", "threshold_operator": "lt", "threshold_value": 1.5, "metadata_type": "" } ] }' ```## Example response```json 200 theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "organization_id": "", "name": "", "description": "", "chart_type": "", "chart_mode": "", "data_type": "", "applies_to_all_agents": true, "bar_mode": "", "aggregation": [ "" ], "time_bucket": "", "group_by": "", "simulation_ids": [ 123 ], "show_indeterminate": true, "filters": null, "column_visibility": null, "color_overrides": { "key": "" }, "center_label": { "slice": "", "clamp_pct": 1.5, "label": "", "benchmark": 1.5, "compare_previous": true, "unit": "" }, "show_legend": true, "created_by": "", "created_at": "", "updated_at": "", "widget_metrics": [], "layout": { "x": 123, "y": 123, "w": 123, "h": 123 } } ``` # API Reference Source: https://docs.getbluejay.ai/api-reference/introduction Make your first API request. The Bluejay REST API takes and returns JSON. To find an endpoint, use the sidebar or the [cheat sheet](/api-reference/cheat-sheet). ## Make your first request **1. Get an API key** Open the [API Keys page](https://app.getbluejay.ai/settings/api-keys) of the app and create a key. The API ignores the `X-Organization-Id` header. **2. Send a request** Send every request to the base URL `https://api.getbluejay.ai`, with the key in the `X-API-Key` header. Endpoint paths start with `/v1`. The two `/v2` retrieve endpoints add the grade of each success-criteria bullet. This request lists the agents your key can reach: ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl https://api.getbluejay.ai/v1/all-agents \ -H "X-API-Key: YOUR_API_KEY" ``` **3. Read the response** A successful request returns a `2xx` status and a JSON body. This request returns a list of agents, and each item has the agent's `id`, which other endpoints take as `agent_id`. Each endpoint page shows the fields of its response and an example. If the request fails, read the status code and the `detail` field, as [Errors](#errors) explains. To try an endpoint without writing code, use the [API Playground](/api-reference/playground). ## Errors When a request fails, the response has an HTTP status code and a JSON body whose `detail` field explains the problem: ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "detail": "Agent not found" } ``` | Status | Meaning | | - | - | | 400 | The request is not valid for the current state, for example a delete that a rule blocks. | | 401 | The API key is missing, not valid, or revoked. | | 402 | The organization needs a payment method. `code` is NO\_PAYMENT\_METHOD or RED\_TEAMING\_PAYMENT\_METHOD\_REQUIRED. | | 403 | The resource is not in your organization or workspace. `code` is INSUFFICIENT\_CREDITS or SPEND\_ALERT\_REACHED when billing blocks the request. | | 404 | The resource does not exist. | | 409 | The request conflicts with current data, for example a duplicate. | | 422 | A field failed validation. `detail` is a list of items with `loc`, `msg`, and `type`. | | 429 | The rate limit is exceeded. The body is `{"error": "Rate limit exceeded: ..."}`. | | 503 | Authentication is not available for a short time. Send the request again. | When billing blocks a request, the body also has a `code` field next to `detail`: ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "detail": "...", "code": "INSUFFICIENT_CREDITS" } ``` ## Pagination A list endpoint that can return many rows splits them into pages, using one of three styles. Each endpoint page shows its parameters, defaults, and maximum values. | Style | Parameters | Example endpoints | | - | - | - | | Page | `page` (starts at 1) and `page_size` | [Get All Digital Humans](/api-reference/endpoint/get-all-digital-humans), [List conversations](/api-reference/endpoint/list-conversations) | | Offset | `limit` and `offset` | [List Issues](/api-reference/endpoint/list-issues), [Retrieve Simulation Results](/api-reference/endpoint/retrieve-simulation-results) | | Limit | `limit` only | [List Traces](/api-reference/endpoint/list-traces), [List Agent Versions](/api-reference/endpoint/list-prompt-versions) | Other list endpoints return all rows in one response. ## Rate limits Endpoints with a rate limit allow 100 requests per minute from each client IP address, unless the end of the endpoint page shows a different limit. [Evaluate](/api-reference/endpoint/evaluate) counts requests for your whole organization instead of for each IP address. It allows 100 requests per minute, or 500 for enterprise accounts. If you go over a limit, the request returns 429. Wait until the next minute, then send the request again. ## Related * [API cheat sheet](/api-reference/cheat-sheet) * [Connect the MCP server](/mcp/overview#connect) * [Bluejay as Code](/bluejay-as-code/overview) # API Playground Source: https://docs.getbluejay.ai/api-reference/playground Try any endpoint from your browser. The page sends the request from your browser. Requests change real data in your workspace, the same as any other API call. The page does not save your API key. Endpoint API key

## Related

* [API Reference](/api-reference/introduction)
* [Cheat Sheet](/api-reference/cheat-sheet)


# Events Webhook
Source: https://docs.getbluejay.ai/api-reference/webhook/events-webhook

Receive Bluejay events at your URL.

To receive events at your own server, register a webhook URL in the dashboard and subscribe it to the events you want. When one of those events occurs, Bluejay sends the result to your URL. To set up a webhook, see [Webhooks](/api-reference/webhooks).## `simulation_result_evaluated`Represents a simulation result evaluated event.

\
            \
            \
            \
        \
NameTypeRequiredDescription
```json Example theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "type": "simulation_result_evaluated", "id": 123, "digital_human_id": 123, "status": "INITIALIZING", "simulation_run_id": 123, "simulation_id": 123, "agent_id": 123, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "result": {}, "custom_metrics": [ { "name": "", "description": "", "response_type": "", "response_value": "", "reasoning": "", "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ "" ], "scoring_guidance": "", "enum_options": [ "" ], "human_edited": true, "human_response_value": "", "human_reasoning": "", "override_reason_code": "", "override_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z" } ], "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": 1.5 }, "custom_metrics": [ { "name": "", "description": "", "response_type": "", "response_value": "", "reasoning": "", "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ null ], "scoring_guidance": "", "enum_options": [ null ], "human_edited": true, "human_response_value": "", "human_reasoning": "", "override_reason_code": "", "override_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z" } ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "created_at": "2026-01-01T00:00:00Z", "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "duration": 123, "latency": [ 1.5 ], "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "tool_calls": [ { "name": "", "start_offset_ms": 123, "description": "", "parameters": {}, "output": null } ], "tags": [ "" ], "metadata": {} } ```## `observability_call_evaluated`Represents an observability call evaluated event. \ \ \ \ \
NameTypeRequiredDescription
```json Example theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "id": "", "agent_id": "", "external_agent_id": "", "recording_url": "", "start_time_utc": "", "participants": [ { "role": "AGENT", "spoke_first": true, "name": "", "phone_number": "" } ], "call_direction": "INBOUND", "interface": "PHONE", "status": "INITIALIZING", "created_at": "2026-01-01T00:00:00Z", "transcript_url": "", "tool_calls": [ { "name": "", "start_offset_ms": 123, "description": "", "parameters": {}, "output": null } ], "events": [ { "title": "", "start_offset_ms": 123, "description": "", "end_offset_ms": 123, "tags": [ "" ], "metadata": {} } ], "tags": [ "" ], "duration_ms": 0, "evaluations": [ { "id": "", "created_at": "2026-01-01T00:00:00Z", "hallucination": true, "hallucination_reasoning": "", "redundancy": true, "redundancy_reasoning": "", "agent_speak_percentage": 1.5, "avg_agent_latency": 1.5, "latency": { "avg_agent_latency": 0, "max_agent_latency": 0, "p50_agent_latency": 0, "p90_agent_latency": 0, "p95_agent_latency": 0, "p99_agent_latency": 0 }, "filler_ignored_latency": { "avg_filler_ignored_latency": 0, "p50_filler_ignored_latency": 0, "p90_filler_ignored_latency": 0, "p95_filler_ignored_latency": 0, "p99_filler_ignored_latency": 0 }, "num_turns": 123, "call_summary": "", "custom_evals": [ null ], "custom_evals_success_rate": 1.5, "goal_success": true, "goal_reasoning": "", "pronunciation_score": 1.5, "pronunciation_reasoning": "", "sentiment_label": "", "sentiment_score": 1.5, "sentiment_scores": { "key": 1.5 }, "custom_metrics": [ { "name": "", "description": "", "response_type": "", "response_value": "", "reasoning": "", "min_value": 1.5, "max_value": 1.5, "category": "", "tags": [ null ], "scoring_guidance": "", "enum_options": [ null ], "human_edited": true, "human_response_value": "", "human_reasoning": "", "override_reason_code": "", "override_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z" } ], "human_edited": true, "human_goal_success": true, "human_goal_reasoning": "", "human_hallucination": true, "human_hallucination_reasoning": "", "human_redundancy": true, "human_redundancy_reasoning": "", "human_pronunciation_score": 1.5, "human_pronunciation_reasoning": "", "override_goal_reason_code": "", "override_goal_notes": "", "override_hallucination_reason_code": "", "override_hallucination_notes": "", "override_redundancy_reason_code": "", "override_redundancy_notes": "", "override_pronunciation_reason_code": "", "override_pronunciation_notes": "", "last_edited_by": "", "last_edited_at": "2026-01-01T00:00:00Z", "predicted_age": 1.5, "customer_gender": "", "gender_confidence": 1.5, "detected_language": "", "language_confidence": 1.5, "agent_audio_clarity": 1.5, "user_audio_clarity": 1.5 } ], "metrics": [ { "metric_name": "", "metric_type": "", "value": "", "human_edited": false, "reasoning": "" } ], "annotations": [ null ], "metadata": {}, "custom_metrics": [ null ], "conversation_ended_by": "AGENT", "type": "observability_call_evaluated" } ```## `simulation_ended`Represents a simulation result ended event. \ \ \ \ \
NameTypeRequiredDescription
```json Example theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "type": "simulation_ended", "id": 123, "digital_human_id": 123, "status": "INITIALIZING", "simulation_run_id": 123, "simulation_id": 123, "agent_id": 123, "folder_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "external_agent_id": "", "created_at": "2026-01-01T00:00:00Z", "start_time": "2026-01-01T00:00:00Z", "end_time": "2026-01-01T00:00:00Z", "duration": 123 } ```## `outbound_simulation_started`Represents an outbound simulation started event. \ \ \ \ \
NameTypeRequiredDescription
```json Example theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "type": "outbound_simulation_started", "agent_id": 123, "simulation_id": 123, "simulation_run_id": 123, "digital_humans": [ { "id": 123, "name": "", "phone_number": "", "associated_simulation_result_ids": [ 123 ] } ] } ``` # Webhooks Source: https://docs.getbluejay.ai/api-reference/webhooks Send Bluejay results to your own tools. Bluejay sends a signed `POST` request with a JSON body to your URL when it evaluates a conversation, ends a simulation, or fires an alert. The [Events Webhook reference](/api-reference/webhook/events-webhook) has the payload schemas. ## Create a webhook To create a webhook, open **Settings → Webhooks** in the [workspace](/administration/workspaces) whose agents it should watch, and enter an HTTPS URL. A webhook fires only for agents in its own workspace. Copy the signing key to your receiver, which uses it to [verify the signature](#verify-the-signature) of each request. To limit the webhook to some agents, select the agents or folders. A folder includes every agent in it. If you select no agents and no folders, the webhook fires for all agents in the workspace. ## Events | UI label | `type` in the body | Fires when | | - | - | - | | Simulation evaluated | simulation\_result\_evaluated | A simulation result finishes evaluation. | | Simulation ended | simulation\_ended | A simulated conversation ends, before evaluation. | | Outbound simulation started | outbound\_simulation\_started | An outbound simulation run starts. | | Observability log evaluated | observability\_call\_evaluated | A production conversation finishes evaluation. | | Observability alert triggered | observability\_alert\_triggered | An observability [alert](/monitor/alerts) enters or leaves alarm. | | Simulation alert triggered | simulation\_alert\_triggered | A simulation alert fires or recovers for a run. `subtype` is `triggered` or `recovered`. | ## Verify the signature Each request has an `X-Bluejay-Signature` header. The value is the hex HMAC-SHA256 of the raw body, signed with your webhook's signing key. 1. Read the raw request body. Do not parse and serialize the JSON again, because the signature uses the exact bytes. 2. Compute `HMAC-SHA256(body, signing_key)` as a hex digest. 3. Compare it to `X-Bluejay-Signature` with a constant-time comparison. 4. If the values do not match, reject the request. ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} import hmac, hashlib def is_valid(body: bytes, signature: str, signing_key: str) -> bool: expected = hmac.new(signing_key.encode(), body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, signature) ``` ## Delivery * Requests come from `api.getbluejay.ai`. If you use an allowlist, allow that host. * Bluejay sends each event once and does not retry. ## Troubleshooting If a webhook does not fire, do these checks: 1. Make sure the webhook is enabled. 2. Make sure the event is selected. 3. Make sure the agent is in the selected agents or folders. 4. Make sure the agent and the webhook are in the same workspace. 5. Check the tag. If a [`POST /v1/evaluate`](/api-reference/endpoint/evaluate) request sets `webhook_tag`, only webhooks with that tag fire. If it does not, webhooks that have a tag do not fire. 6. Make sure your URL is reachable from the internet. ## Related * [Events Webhook reference](/api-reference/webhook/events-webhook) * [Simulation Results](/test/simulations/create#read-the-results) * [Alerts](/monitor/alerts) * [Logs](/monitor/logs) # Bluejay as Code Cookbook Source: https://docs.getbluejay.ai/bluejay-as-code/cookbook > [!WARNING] > > [JSON will be deprecated](/bluejay-as-code/overview#move-from-json-to-yaml) on November 20th, 2026. Each example below is one item of a list in your payload file, shown under the name of its list so you can paste it in place. For the full field lists, see [create-digital-human](/api-reference/endpoint/create-digital-human), [add-agent](/api-reference/endpoint/add-agent), [update-simulation](/api-reference/endpoint/update-simulation), and [create-custom-metric](/api-reference/endpoint/create-custom-metric). ## Renamed fields A few fields have a different name in the payload than in the [API](/api-reference/introduction): | Payload field | API field | Entity | | - | - | - | | `description` | `intent` | Digital Human | | `human_name` | `name` | Digital Human | | `temperature` | `creativity` | Digital Human | | `description` | `prompt` | Custom metric (old files only) | When you push a Digital Human, you can also set its voice in one field, in the form `language_accent_gender`, for example `accent: en_american_masculine`. Bluejay splits it into `language`, `accent`, and `gender`, and a pull always returns those three fields. ## Digital Human types The `tag` field sets the type of a Digital Human, except for a Customer Journey, which uses `journey_steps` instead. To keep the examples short, they leave out `simulations`. > [accordion] Base > > ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > digital_humans: > - bluejay_as_code_id: a0e7b3d2-4c8f-4a91-b3e6-1d5f9c2e7a44 > human_name: Maria Alvarez > description: New patient booking her first physical with Dr. Patel. > success_criteria: Agent books a Tuesday or Thursday morning slot with Dr. Patel. > ``` > > ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > { > "digital_humans": [ > { > "bluejay_as_code_id": "a0e7b3d2-4c8f-4a91-b3e6-1d5f9c2e7a44", > "human_name": "Maria Alvarez", > "description": "New patient booking her first physical with Dr. Patel.", > "success_criteria": "Agent books a Tuesday or Thursday morning slot with Dr. Patel." > } > ] > } > ``` > [accordion] Voicemail > > To write the greeting yourself, set `tag` to `voicemail-custom` and put the greeting in `message`, as in the example. To have Bluejay generate the greeting, set `tag` to `voicemail-ai-generated`, set `speaks_first_config.mode` to `ai_generated`, and leave out `message`. A voicemail Digital Human needs no `description` or `success_criteria`. > > ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > digital_humans: > - bluejay_as_code_id: 9b3c7d5e-2a41-4a0f-8c6b-3e2d1f9a7c50 > human_name: Voicemail Line > tag: voicemail-custom > speaks_first_config: > speaks_first: true > mode: custom > message: Hi, you have reached Maria. Leave a message after the tone. > ``` > > ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > { > "digital_humans": [ > { > "bluejay_as_code_id": "9b3c7d5e-2a41-4a0f-8c6b-3e2d1f9a7c50", > "human_name": "Voicemail Line", > "tag": "voicemail-custom", > "speaks_first_config": { > "speaks_first": true, > "mode": "custom", > "message": "Hi, you have reached Maria. Leave a message after the tone." > } > } > ] > } > ``` > > > [!NOTE] > > > > If `tag` has more than one label, put the voicemail label first, because Bluejay checks only the first label. > [accordion] Transcript replay > > To replay a real call, use `formatted_transcript` in place of `description` and `success_criteria`. If you have the call only as raw text, put it in `original_transcript` instead, and Bluejay uses an LLM to split it into turns. > > ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > digital_humans: > - bluejay_as_code_id: 6f1a9c3e-7b2d-4e11-9a5f-3c8d2b1e6a90 > human_name: Replayed Caller > formatted_transcript: > - role: USER > utterance: Hi, I need to reschedule my appointment. > - role: AGENT > utterance: Sure, what day works better for you? > ``` > > ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > { > "digital_humans": [ > { > "bluejay_as_code_id": "6f1a9c3e-7b2d-4e11-9a5f-3c8d2b1e6a90", > "human_name": "Replayed Caller", > "formatted_transcript": [ > { > "role": "USER", > "utterance": "Hi, I need to reschedule my appointment." > }, > { > "role": "AGENT", > "utterance": "Sure, what day works better for you?" > } > ] > } > ] > } > ``` > [accordion] Customer Journey > > Each step becomes one call, and Bluejay makes the calls in step order. To learn how journeys work, see [Customer Journeys](/test/simulation-types/customer-journeys). > > ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > digital_humans: > - bluejay_as_code_id: d4f8a2c1-6b3e-4a09-8f27-1c5e9b0d3a76 > human_name: Returning Caller > journey_steps: > - step: 1 > intent: Book a Tuesday morning physical with Dr. Patel > success_criteria: Appointment booked and confirmation number read back > - step: 2 > intent: Call back to cancel the appointment > success_criteria: Appointment cancelled > ``` > > ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} > { > "digital_humans": [ > { > "bluejay_as_code_id": "d4f8a2c1-6b3e-4a09-8f27-1c5e9b0d3a76", > "human_name": "Returning Caller", > "journey_steps": [ > { > "step": 1, > "intent": "Book a Tuesday morning physical with Dr. Patel", > "success_criteria": "Appointment booked and confirmation number read back" > }, > { > "step": 2, > "intent": "Call back to cancel the appointment", > "success_criteria": "Appointment cancelled" > } > ] > } > ] > } > ``` > [accordion] Scenario Builder > > [Scenario Builder](/test/simulation-types/scenario-adherence) generates Digital Humans with the `Scenario` tag, `workflow_v2_id`, `workflow_path_index`, and `enriched_playback`. Do not write `enriched_playback` by hand, because it does not stay in sync with the scenario graph. > [accordion] Red Teaming > > [Red Teaming](/test/red-teaming/overview) generates Digital Humans with `attack_vector`, `attack_type`, and `attack_plan`. Start these from a [Red Teaming run](/test/red-teaming/overview#launch-a-run), not from Bluejay as Code. ## Agents ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} agents: - bluejay_as_code_id: f3d2a87c-1e4b-4b9a-9c2d-7f1e6b5a4c33 name: Front Desk Scheduler system_prompt: You are the front desk scheduling agent for Cedar Park Family Medicine. type: INBOUND goals: - Verify caller identity - Book, reschedule, or cancel the appointment ``` ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "agents": [ { "bluejay_as_code_id": "f3d2a87c-1e4b-4b9a-9c2d-7f1e6b5a4c33", "name": "Front Desk Scheduler", "system_prompt": "You are the front desk scheduling agent for Cedar Park Family Medicine.", "type": "INBOUND", "goals": [ "Verify caller identity", "Book, reschedule, or cancel the appointment" ] } ] } ``` ## Simulations ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} simulations: - bluejay_as_code_id: b1a04e88-7c2f-4d23-9a5e-2f8c6d1b7a09 name: Scheduling Coverage max_concurrent: 5 max_call_duration: 10 max_call_duration_units: minutes hangup_on_transfer: true ``` ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "simulations": [ { "bluejay_as_code_id": "b1a04e88-7c2f-4d23-9a5e-2f8c6d1b7a09", "name": "Scheduling Coverage", "max_concurrent": 5, "max_call_duration": 10, "max_call_duration_units": "minutes", "hangup_on_transfer": true } ] } ``` Push cannot move an existing simulation to a different agent. ## Custom metrics ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} custom_metrics: - bluejay_as_code_id: 2b8d4c1f-9a3e-4f72-b5c0-6e1d8a7f3c44 name: DOB Verified Before PHI prompt: The agent verifies the caller's date of birth before it discusses patient information. metric_type: llm_judge eval_segment: agent scope: all response_type: pass_fail ``` ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "custom_metrics": [ { "bluejay_as_code_id": "2b8d4c1f-9a3e-4f72-b5c0-6e1d8a7f3c44", "name": "DOB Verified Before PHI", "prompt": "The agent verifies the caller's date of birth before it discusses patient information.", "metric_type": "llm_judge", "eval_segment": "agent", "scope": "all", "response_type": "pass_fail" } ] } ``` `metric_type` decides which other fields the metric uses. For the metric types, see [custom metrics](/test/metrics#metric-types). For the rules, see [metric conditions](/test/metrics#add-metric-conditions) and [composite metrics](/test/metrics/composite). ### Conditional metrics This metric checks the copay only on conversations that reach one node of the agent workflow: ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} custom_metrics: - bluejay_as_code_id: e6b0d419-2c7a-4f35-8d91-5a3f7c2e0b18 name: Copay Explained prompt: Did the agent state the copay amount for the visit? metric_type: llm_judge response_type: pass_fail settings: fire_conditions: groups: - conditions: - type: workflow_node node_id: node_4a71c9e2b83d5f60 ``` ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "custom_metrics": [ { "bluejay_as_code_id": "e6b0d419-2c7a-4f35-8d91-5a3f7c2e0b18", "name": "Copay Explained", "prompt": "Did the agent state the copay amount for the visit?", "metric_type": "llm_judge", "response_type": "pass_fail", "settings": { "fire_conditions": { "groups": [ { "conditions": [ { "type": "workflow_node", "node_id": "node_4a71c9e2b83d5f60" } ] } ] } } } ] } ``` `fire_conditions` holds a list of `groups`, and each group holds a list of `conditions`. The `join` inside a group says how its conditions combine, and the `join` on `fire_conditions` says how the groups combine. Set `join` to `and` (the default) or `or`. A metric can have 10 conditions at most. Each condition has a `type`, and each type needs its own fields: | `type` | Fields | | - | - | | `workflow_node` | `node_id` | | `tool_call` | `tool_name` | | `metric` | `metric_id`, `operator`, `value` | Supported values for `operator` include: * `equals` * `not_equals` * `greater_than` * `less_than` * `greater_than_or_equal` * `less_than_or_equal` * `contains` * `not_contains` ### Composite metrics To give a number, combine the input metrics in `master_formula`: ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} custom_metrics: - bluejay_as_code_id: 3d1f8b60-9a4c-4e27-b5d3-0c6e2a7f4193 name: Scheduling Quality Score prompt: Weighted 1-5 score from scheduling clarity and confirmed details. metric_type: composite response_type: quantitative min_value: 1 max_value: 5 settings: composite: output_type: quantitative variables: - metric_id: 7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37 - metric_id: 9f3a1c7e-5b2d-4e88-a4f1-0c7b3d6a9e21 value_map: pass: 5 fail: 1 master_formula: round("7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37" * 0.6 + "9f3a1c7e-5b2d-4e88-a4f1-0c7b3d6a9e21" * 0.4) ``` ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "custom_metrics": [ { "bluejay_as_code_id": "3d1f8b60-9a4c-4e27-b5d3-0c6e2a7f4193", "name": "Scheduling Quality Score", "prompt": "Weighted 1-5 score from scheduling clarity and confirmed details.", "metric_type": "composite", "response_type": "quantitative", "min_value": 1, "max_value": 5, "settings": { "composite": { "output_type": "quantitative", "variables": [ { "metric_id": "7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37" }, { "metric_id": "9f3a1c7e-5b2d-4e88-a4f1-0c7b3d6a9e21", "value_map": { "pass": 5, "fail": 1 } } ], "master_formula": "round(\"7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37\" * 0.6 + \"9f3a1c7e-5b2d-4e88-a4f1-0c7b3d6a9e21\" * 0.4)" } } } ] } ``` To give a label instead, set `output_type` to `categorical` and `response_type` to `enum`, and write `rules` in place of `master_formula`: ```yaml YAML theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} rules: - output: Clean conditions: groups: - join: and conditions: - metric_id: 7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37 operator: greater_than_or_equal value: 4 - metric_id: 9f3a1c7e-5b2d-4e88-a4f1-0c7b3d6a9e21 operator: equals value: 1 - output: Poor conditions: groups: - conditions: - metric_id: 7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37 operator: less_than value: 4 ``` ```json JSON (deprecated) theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "rules": [ { "output": "Clean", "conditions": { "groups": [ { "join": "and", "conditions": [ { "metric_id": "7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37", "operator": "greater_than_or_equal", "value": 4 }, { "metric_id": "9f3a1c7e-5b2d-4e88-a4f1-0c7b3d6a9e21", "operator": "equals", "value": 1 } ] } ] } }, { "output": "Poor", "conditions": { "groups": [ { "conditions": [ { "metric_id": "7c4e2a10-3f8b-4d95-8e62-1a9d5c0b4f37", "operator": "less_than", "value": 4 } ] } ] } } ] } ``` * List the input metrics in `variables`. For a metric whose result is not a number, such as Pass/Fail, add a `value_map` that turns each result into a number, for example `pass: 5` and `fail: 1`. * In `master_formula`, refer to a metric by its ID in double quotes. Supported operators include: * `+` * `-` * `*` * `/` * `%` * `**` * Supported functions include: * `min` * `max` * `abs` * `round` * `floor` * `ceil` * Bluejay checks `rules` in order and uses the first match. If no rule matches, the result is Not Applicable. * A composite metric can have 10 rules at most, each with 10 conditions at most. A rule can read only the metrics listed in `variables`, and its conditions use the same operators as [conditional metrics](#conditional-metrics). ## Related * [Bluejay as Code API](/api-reference/endpoint/push-bluejay-as-code) * [Bluejay as Code](/bluejay-as-code/overview) * [Digital Humans](/test/simulations/digital-humans) * [Metrics](/test/metrics) # Bluejay as Code Source: https://docs.getbluejay.ai/bluejay-as-code/overview Manage your Bluejay setup as code. > [!WARNING] > > [JSON will be deprecated](#move-from-json-to-yaml) on November 20th, 2026. Bluejay as Code saves your agents, simulations, Digital Humans, and custom metrics as a YAML file. Keep the file in your Git repository, and change your setup the same way you change your code: 1. [Pull](#pull-the-payload) your current setup from Bluejay into a file. 2. [Edit](#edit-the-payload) the file, and review the change in a pull request. 3. [Push](#push-the-payload) the file back to Bluejay, by hand or from your CI pipeline. Each change then has a history and a reviewer. [https://www.youtube.com/embed/MnFCBV9PwMA](https://www.youtube.com/embed/MnFCBV9PwMA) ## Pull the payload To pull, request the type and ID of the entity you start from. The response is YAML. Until JSON is deprecated, add `format=json` to get JSON. This example pulls a simulation: ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl "https://api.getbluejay.ai/v1/bluejay-as-code/simulation/$SIM_ID" \ -H "X-API-Key: $BLUEJAY_API_KEY" \ -o simulation.yaml ``` To pull a different type, replace `simulation` in the URL. Supported root types include: * `simulation` * `agent` * `digital-human` * `custom-metric` For the ID, use either the entity ID or its `bluejay_as_code_id`. The payload holds that entity and the entities related to it, so pulling a simulation also returns its agent, Digital Humans, and custom metrics: ```yaml simulation.yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} agents: - bluejay_as_code_id: f3d2a87c-1e4b-4b9a-9c2d-7f1e6b5a4c33 name: Front Desk Scheduler system_prompt: | You are the front desk scheduling agent for Cedar Park Family Medicine. Verify the caller's date of birth before you discuss patient information. simulations: - bluejay_as_code_id: b1a04e88-7c2f-4d23-9a5e-2f8c6d1b7a09 name: Scheduling Coverage digital_humans: - bluejay_as_code_id: a0e7b3d2-4c8f-4a91-b3e6-1d5f9c2e7a44 human_name: Maria Alvarez description: New patient booking her first physical with Dr. Patel. success_criteria: Agent books a Tuesday or Thursday morning slot with Dr. Patel. simulations: - b1a04e88-7c2f-4d23-9a5e-2f8c6d1b7a09 custom_metrics: - bluejay_as_code_id: 2b8d4c1f-9a3e-4f72-b5c0-6e1d8a7f3c44 name: DOB Verified Before PHI prompt: The agent verifies the caller's date of birth before it discusses patient information. ``` Long text like a system prompt comes back as a `|` block, so pull requests show prompt edits line by line. ## Edit the payload * To update an entity, change its fields. * To add an entity, add an item with a new `bluejay_as_code_id` to its list. Generate the UUID one time (for example with `uuidgen`) and commit it. * To unlink a Digital Human or custom metric, remove it from the list that links it. Each entity takes the same fields as its API resource, except for a few Digital Human fields that have different names. The [Cookbook](/bluejay-as-code/cookbook) lists them, with an example of each entity. A simulation has no field for its agent, so Bluejay finds the agent from the payload. If the payload has one agent, Bluejay links the new simulation to it. If the payload has more than one agent, add the simulation's `bluejay_as_code_id` to the `simulations` list of the agent it belongs to. Quote hand-typed values that YAML would otherwise turn into numbers or booleans, such as `'+15551234567'` or `'no'`. Pulled files already quote them. YAML anchors and aliases (`&`, `*`) are not supported. ## Push the payload Send the file with the `Content-Type: application/yaml` header, or Bluejay reads it as JSON and the push fails. Use `--data-binary`, since `--data` strips the line breaks YAML needs. ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} curl https://api.getbluejay.ai/v1/bluejay-as-code \ -H "X-API-Key: $BLUEJAY_API_KEY" \ -H "Content-Type: application/yaml" \ --data-binary @simulation.yaml ``` Bluejay replies with what it changed: ```json response theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}} { "valid": true, "errors": [], "actions": [ "Updated agent 'Front Desk Scheduler'", "Created digital human 'Eleanor Pham'", "Linked 1 existing digital human(s) to simulation" ], "simulation_id": 1284 } ``` Bluejay matches each entity by `bluejay_as_code_id`: | Case | Result | | - | - | | New bluejay\_as\_code\_id | Bluejay creates the entity. | | Known bluejay\_as\_code\_id | Bluejay updates the entity. | | Digital Human missing from a simulation's links | Bluejay removes it from the simulation. The Digital Human stays. | | Custom metric missing from an agent's links | Bluejay detaches it from the agent. The metric stays. | Each link list in the payload replaces the current links on push, which is why removing an entry from a list unlinks it. > [!WARNING] > > A push with errors still returns HTTP `200`, so it can fail without anything noticing. Check `valid` in the response after every push: when it is `false`, the `errors` list says what went wrong. A push returns HTTP `400` if the YAML cannot be read, if a link points to a Digital Human or custom metric that is in neither the payload nor Bluejay, or if a new simulation does not have exactly one agent. ## Move from JSON to YAML JSON will be deprecated on November 20th, 2026. To move a JSON file to YAML: 1. If the JSON file has changes you have not pushed, push it one last time. 2. Pull the same root again, as in [Pull the payload](#pull-the-payload). 3. Commit the YAML file in place of the JSON file, and change your CI pipeline to push the YAML file with `Content-Type: application/yaml`. The `bluejay_as_code_id` values do not change, so your next push updates the same entities. ## Claude Code skill Give Claude Code this skill to write and push payloads for you. [Download skill `bluejay-as-code.skill.txt`](https://raw.githubusercontent.com/bluejay-ai-dev/docs/main/bluejay-as-code/skill.txt) ## Related * [Bluejay as Code API](/api-reference/endpoint/pull-bluejay-as-code) * [Bluejay as Code Cookbook](/bluejay-as-code/cookbook) * [CI/CD Integration](/api-reference/ci-cd) * [Metrics](/test/metrics) # Changelog Source: https://docs.getbluejay.ai/changelog See what is new in Bluejay. Filter by tag **November 3rd, 2026** ## Agent variables Set values once on an agent in **Agent Variables** on the **Simulation Settings** tab, and every Digital Human of that agent uses them on its next run. A Digital Human's trait with the same name overrides an agent variable. Write `{{name}}` in success criteria, intent, description, or personality, and Bluejay fills in the value before the Digital Human and the grader see it, for voice and text. Synced Retell conversation flow and ElevenLabs agents fill their agent variables from the provider's default dynamic variables when they have none yet. [Agent variables](/test/simulations/digital-humans#agent-variables) · [Update Agent](/api-reference/endpoint/update-agent) **November 3rd, 2026** ## incident.io paging Alerts and uptime monitors can now page through incident.io. Create an HTTP alert source in incident.io, paste its source ID and token under Settings → Integrations, then switch on incident.io Notifications on any alert or monitor. DOWN fires an alert and recovery resolves it. [incident.io setup](/monitor/alerts#connect-a-channel) **October 20th, 2026** ## Bluejay as Code in YAML Bluejay as Code now reads and writes YAML. Pull with `format=yaml` and push with `Content-Type: application/yaml`. System prompts and other long text come back as multi-line blocks, so a pull request shows a prompt change line by line. **Deprecated:** JSON payloads, on November 20th, 2026. [Bluejay as Code](/bluejay-as-code/overview) · [Move from JSON to YAML](/bluejay-as-code/overview#move-from-json-to-yaml) **October 20th, 2026** ## A new look for the docs We rebuilt these docs to be shorter, clearer, and easier to get around. Every page now matches the product, related pages are merged into one place, and the new quickstart gets your agent tested in a few steps. Old links still work, so your bookmarks take you to the right page. [Quickstart](/) · [Glossary](/glossary) · [MCP Server](/mcp/overview) **October 15th, 2026** ## Itemized success criteria Success criteria are bullets now. Each bullet is a workspace `success_criterion` metric. Bluejay grades each expected behavior met / not met, stores `success_score` as passed-count / `max_value`, keeps overall pass/fail at 100%, and reports `criteria_pass_rate` (0–100) on `/v2` retrieve. `/v1` digital human get, create, update, generate, and retrieve stay a string and a boolean. There is no public `/v2` generate route yet. [Success Criteria](/key-concepts/digital-humans/success-criteria) · [Retrieve Results v2](/api-reference/endpoint/retrieve-simulation-results-v2) **September 29th, 2026** ## API key on HTTP text messages `POST /v1/send-http-text-message` now requires your API key on every request. Send it as `X-API-Key` or `Authorization: Bearer` with each message and each tool-call log. A request without a key returns 401. A key from another organization, or a key limited to a workspace that doesn't own the simulation, returns 404. If your agent already sends the same key you use to queue the simulation, nothing changes. [Send HTTP Text Message](/api-reference/endpoint/send-http-text-message) · [Chat testing](/integrations/http-webhooks) **September 9th, 2026** ## Agent versions **New:** agent versions live at `/v1/agents/{id}/versions` (create, list, get, delete, promote, labels). **Same as before:** `POST /v1/evaluate` and `/evaluate-call`. New optional integer `version`. `label` still works. Omit `version` and we use the version that currently has the `production` label. An unknown version uses the production version and returns a `warning`. An unknown label is created and attached to the production version. **Deprecated:** `/v1/agents/{id}/prompts` paths still work. Get-by-label stays on `GET /prompts?label=` (no `/versions` twin). **New:** create/queue simulation accepts `agent_version_id`. **Deprecated:** `prompt_id` on create/queue simulation. Same uuid, still works. If both are sent and they differ, the request is 400. [Evaluate](/api-reference/endpoint/evaluate) · [Create Agent Version](/api-reference/endpoint/create-prompt-version) **September 1st, 2026** ## Better Stack paging Alerts and uptime monitors can now page through Better Stack alongside PagerDuty. Paste a Better Stack Uptime API token under Settings → Integrations, then switch on Better Stack Notifications on any alert or monitor. DOWN opens an incident and recovery resolves it, with nothing to configure on the Better Stack side. [Better Stack and PagerDuty setup](/monitor/alerts#connect-a-channel) **August 19th, 2026** ## Issues Production failures now group into Issues you can triage. Patterns appear once the same problem recurs across calls, with a title. Known errors (a tool 500, a tool that should have run but never did) appear as soon as they are recognized. Open Monitor → Issues for the full list, grouped by status. The list is not paginated. [Issues](/monitor/issues) · [Monitor → Issues](/monitor/observability/issues) · [List Issues API](/api-reference/endpoint/list-issues) **August 18th, 2026** ## Topics (early access) Bluejay now clusters what's happening across your production calls automatically. The **Topics** map is an interactive view of what your callers talked about: pan, zoom, search, and see trends against the prior window. Rolling out to select organizations first. Contact us for access. [Logs](/monitor/logs) **August 18th, 2026** ## Expanded language coverage Digital Humans picked up a wave of new languages and dialects this summer: Urdu, Hebrew, Tagalog, Telugu, Tamil, Malayalam, Kannada, Marathi, and Gujarati, plus Egyptian and Levantine Arabic with native dialect voices. Vietnamese and Cantonese voice coverage was also filled out, and every non-English language received dialect-aware prompting for more authentic speech. [Digital Humans overview](/test/simulations/digital-humans) **August 11th, 2026** ## Custom SIP headers Simulations can now attach custom SIP headers to the calls they place. Headers configured on the agent are delivered on the SIP INVITE, so agents behind infrastructure that routes or authenticates on custom headers can be tested exactly as they run in production. [SIP connections](/integrations/sip) **August 11th, 2026** ## Custom metrics judged on call audio Audio custom metrics are now judged natively on the call recording by an audio-capable model, with optional knowledge-base grounding. Tone, pacing, pronunciation, and other things a transcript can't capture are now first-class evaluation targets. [Custom metrics overview](/test/metrics) **August 11th, 2026** ## Outbound call-outcome metrics & spoken-phrase checks Eight new library metrics for outbound calling: LLM-judged outcomes (human picked up, voicemail detected, transfer attempted, stuck call, abrupt termination, natural delivery) plus deterministic required-disclosure and prohibited-wording checks. Phrase metrics are authored by simply typing the words the agent must (or must not) say — Bluejay compiles the matching and absorbs ASR variance like punctuation and acronym spellings automatically. [Metric types](/test/metrics) **August 11th, 2026** ## Twilio account linking Link your own Twilio account from Settings → Integrations, so simulations can dial using your Twilio numbers. **August 11th, 2026** ## Pipecat improvements Bluejay's Pipecat Cloud integration now sends the run's metadata in the start-call body, so your Pipecat agent can identify and branch on the Bluejay test run that's calling it. Sessions also end cleanly when the agent hangs up or fails to start, instead of waiting for a timeout. [Pipecat simulations](/integrations/pipecat) **August 11th, 2026** ## Spend breakdown in credits The Spend page now breaks your usage down per product, denominated in credits, and the usage page breaks credit consumption down by agent and by individual simulation — including observability-only agents. **August 4th, 2026** ## Bland integration Bland is now a fully supported provider. Connect from Create Agent with inline API key setup, pick a Conversational Pathway, and pull, edit, push, and publish pathway versions from an interactive canvas inside Bluejay. Simulations run over Bland's native voice bridge (with PSTN dialing also supported) and record the exact path each call took through the pathway graph, and Bland production calls can be ingested into observability. [Bland Observability](/integrations/bland) · [Bland Simulations](/simulation-integrations/bland) **August 4th, 2026** ## Natural-language log filtering Filter your call logs by just typing. Plain-English queries are translated into structured log filters automatically, on top of the freeform full-text search over call summaries that shipped earlier in July. [Logs](/monitor/logs) **August 4th, 2026** ## Knowledge bases: URL & HTML ingestion Knowledge bases now accept web pages directly by URL — Bluejay crawls and ingests the page server-side — as well as uploaded HTML files, alongside the existing document upload flow. **July 28th, 2026** ## Amelia integration Test Amelia agents on Bluejay over both chat and voice. Enter your Amelia credentials in Settings → Integrations, pick a domain and flow, and sync agents into Bluejay. You can view and edit the agent's flow on an interactive canvas and push changes back to Amelia. [Amelia integration](/integrations/amelia) **July 28th, 2026** ## Deep Reports Agent-generated, verified reports built from your simulation and observability data. A report studio lets you edit the report through chat on a Bluejay-native canvas, schedule recurring sends, and email the result — with PDF export for run comparisons. **July 28th, 2026** ## Dashboard widgets: histograms, filters, and 32 new metrics A major dashboard upgrade: a histogram widget for numeric metric distributions, 32 newly graphable metrics in the widget dialogs, distribution aggregation for integer-scale custom metrics, per-widget conversation filters, metadata Group By, and click-a-threshold-bar to filter the explorer to that group. The Logs page also gained a Table | Chart toggle to chart whatever view you've filtered to. [Dashboards](/monitor/dashboards) **July 28th, 2026** ## Answer Latency Every simulated call now measures how long the agent took to answer, across all transports. Answer Latency shows up in the conversation Evals tab and as a sortable column in simulation run results, so slow pickup is a trackable signal. **July 28th, 2026** ## Human review overrides Reviewers can override an automated metric verdict by hand. The human correction is stored alongside the original AI grade — both are preserved — and corrected values show up everywhere: tables, aggregates, and reports. [Custom metrics overview](/test/metrics) **July 28th, 2026** ## Bluejay in Slack Ask Bluejay about your agents, simulations, and production conversations directly from Slack. The per-org Slack bot supports threaded follow-ups without re-tagging, works in externally shared channels, and performs write actions safely via one-click approval messages. [Slack integration](/monitor/alerts#connect-a-channel) **July 28th, 2026** ## Outbound trigger webhook For agents that dial out from your own system, configure a trigger webhook in agent settings: Bluejay calls it to tell your infrastructure to place the call (or send the SMS) to the Digital Human. Works with any provider, so outbound agents are testable without Bluejay controlling the dialer. **July 28th, 2026** ## Extension dialing (DTMF) Digital Humans can now dial a configured extension as DTMF tones after connecting, so agents behind IVR menus and extension routing can be tested end to end. Extensions can be set per Digital Human (including in bulk) and on red-team launches. **July 28th, 2026** ## Google Cloud: selective sync & keyless setup Choose exactly which Google Conversational Agents to sync (or toggle sync-all), and connect your Google Cloud project without service-account keys using least-privilege Workload Identity Federation, configured from the settings UI with a paste-and-run Cloud Shell flow. [Keyless Google Cloud setup](/integrations/google-dfcx#keyless-setup) **July 28th, 2026** ## Grounded, customizable judging LLM-judge custom metrics can now ground their evaluation in your knowledge base, so factual-accuracy metrics grade against your actual documentation. Standard hallucination and redundancy metrics accept per-org prompt overrides and are editable like custom metrics, and new default eval models improve text and audio judging quality. [Prompting guide](/test/metrics/llm-as-a-judge#prompting-guide) **July 28th, 2026** ## Digital Human management upgrades A table view of Digital Humans with inline per-field editing, per-Digital-Human run history pages, duplicate-to-a-target-count, and two new generation sources: build Digital Humans from your knowledge base's topics, or derive traits from your agent's template variables so provider call variables are filled with each persona's data. [Digital Humans overview](/test/simulations/digital-humans) **July 28th, 2026** ## Trace view v2 with token costs A redesigned trace experience: per-leg latency dashboards, a rebuilt trace side panel with a standalone full view, and trace export alongside simulation results. Model spans now show token usage (input/cached/output, text/audio splits) with estimated cost per model and trace-level totals. ElevenLabs agent traces are ingested via OpenTelemetry, so their tool calls and spans appear like any other provider's. [Traces](/monitor/traces) **July 21st, 2026** ## Self-serve signup Bluejay is open to self-serve signups. Sign up with email verification, land in a redesigned onboarding flow with Bluejay AI as your first experience, and start testing immediately against seeded sample agents — including read-only "Bug Bounty" challenge agents built to be probed. [Quickstart](/) **July 21st, 2026** ## Metrics Library An app-store-style library at /metrics: browse standard and community-published metric templates, preview them, rate them, and add them to your org in one click. You can publish your own metrics to the library through a review queue, and My Metrics was restructured to match. [Custom metrics overview](/test/metrics) **July 21st, 2026** ## Red teaming revamp A rebuilt red-team experience: a dedicated launch flow and results page with an OWASP/ATLAS-mapped scorecard and leak table, opt-in content-safety attacks as a distinct attack category, audio-native attacker behaviors, keypad (DTMF) attacks, and extension support for targets behind IVRs. [Red teaming](/test/red-teaming/overview) · [Content safety](/test/red-teaming/overview) **July 21st, 2026** ## Import workflow diagrams & IVR test plans Drop a workflow diagram (for example an IVR flowchart image) into Bluejay AI and it becomes an editable Agent Workflow with a generated checklist-style test plan covering the flow's paths. Step-based IVR test-plan exports import too: Bluejay turns them into transcript-replay Digital Humans, so existing IVR test scripts become runnable simulations. [Agent workflows](/test/simulations/create) **July 21st, 2026** ## Audio Clarity Score A single 0–100 audio clarity score on every call, replacing the earlier burst-SNR approach. The agent channel is scored for intelligibility and the caller channel with DNSMOS, calibrated against a human-labeled gold set, so brief bad stretches aren't averaged away. **July 21st, 2026** ## Multimodal journeys & follow-up SMS Customer journeys can now mix voice and SMS — for example an SMS leg that ends when the call leg starts — with per-step success criteria and transition guards. Follow-up SMS gets full configuration: call association, a sender allowlist on the Phone Numbers page, and a per-simulation SMS inactivity timeout. [Customer journeys](/test/simulation-types/customer-journeys) · [Follow-up SMS](/test/simulations/digital-humans) **July 21st, 2026** ## Smarter call endings Whether a simulated call should end is now decided by a consensus of judges, with a transfer-intent classifier gating hangups on transfer — so Digital Humans stop hanging up prematurely on ambiguous turns. Chat simulations gained the same discipline: conversations no longer end while the agent's question is still pending. **July 14th, 2026** ## Pay-as-you-go, auto-reload & plan limits New orgs are provisioned straight onto pay-as-you-go with billing attached at signup, with an optional automatic credit top-up and a wallet-balance view. The billing tab was redesigned with new plan cards, credit codes are redeemable, plan switches reuse your saved card, and unused base allotment rolls over as credit. Plan entitlements — phone number counts, simulation concurrency, data retention — are now enforced in real time. **July 14th, 2026** ## Unified knowledge bases (RAG) Knowledge bases became a full retrieval feature: upload documents, watch ingestion status, and attach knowledge bases to agents. Knowledge you upload once now grounds digital-human behavior, chat simulations, and metric judging consistently everywhere. **July 14th, 2026** ## Phone number management Buy phone numbers in bulk in a single purchase, with limits driven by your plan instead of a hardcoded cap, and a per-number SMS Enabled indicator so you know which numbers can run SMS tests. **July 7th, 2026** ## Uptime Monitoring Continuous health checks for production agents: Bluejay periodically places real calls (or SMS/webchat sessions) against your agent, detects incidents, and alerts on failures — Slack with optional @channel, a configurable consecutive-failure threshold, and latency tracking with 7-day aggregates. Health checks can run full conversations with your own Digital Human, grade with your custom metrics, respect day/hour active windows, and be paused and resumed. [Uptime monitoring](/monitor/uptime/overview) **July 7th, 2026** ## Voice Agent Audit A free public audit: enter your agent's phone number on the landing page and Bluejay runs \~20 tailored test calls with custom metrics and audio-quality checks, then emails you an exec-readable PDF report of the findings. **July 7th, 2026** ## Custom telephony connections For orgs with their own telephony: Bluejay can call a webhook you host at dial time to fetch a per-call SIP endpoint (dynamic routing, ephemeral endpoints), LiveKit agents can authenticate via API key or a token webhook, and outbound simulations can admit authenticated inbound SIP — so setups where your infrastructure originates or routes the call are fully testable. [Dynamic SIP webhook](/integrations/sip#dynamic-sip-webhook) **July 7th, 2026** ## No-answer diagnostics Calls your agent never answers are now diagnosable: no-answer results carry the recording and the caller-side transcript so you can hear exactly what happened, and dial timeouts are classified correctly instead of as generic failures. **June 30th, 2026** ## Tool Call metric & tool adherence A new tool\_call metric type deterministically checks whether the agent called the right tools — pick tool names from a combobox, no LLM prompt needed. Tool adherence supports expected tool calls with parameter comparison and an order-enforcement toggle, and grading waits for the expected tools' traces to arrive before scoring. [Tool calls](/test/metrics#tool-calls-events-and-metadata) **June 30th, 2026** ## Vapi squads & Retell conversation flows Multi-assistant Vapi squads render as editable workflow canvases, Retell conversation flows get a dedicated editor, and auto-sync keeps Retell, Vapi, and ElevenLabs agents current — with an org-level toggle controlling re-sync before every simulation. [Vapi simulations](/simulation-integrations/vapi) · [Retell integration](/integrations/retell) **June 30th, 2026** ## Self-improve for Vapi agents Bluejay can close the test-fix-retest loop for Vapi agents: it analyzes failed results, proposes prompt improvements, applies them, and announces runs when they finish. [Self-improve](/improve/self-improve) **June 30th, 2026** ## Usage alerts Get notified when your org crosses credit-usage thresholds, framed by credits remaining. Every org is seeded with default alerts at 80% and 100% of its allotment, with recipient selection including your whole team. [Alerts overview](/monitor/alerts) **June 30th, 2026** ## Voice scenes Describe a voice as a scene — "tired commuter on a train" — and Bluejay generates a matching custom voice with bundled background ambience, giving Digital Humans situationally realistic audio. [Digital Humans overview](/test/simulations/digital-humans) **June 30th, 2026** ## Cross-agent run comparison Compare simulation runs across different agents: stage runs into a comparison tray that persists as you browse, then open a side-by-side comparison — with PDF export and instant email send. [Simulation runs](/test/simulations/create#read-the-results) **June 30th, 2026** ## Simulation run controls Finer control over how simulations run: a delay-between-tests setting, concurrency capped to your phone-number pool and org ceiling, an org-level max call length with per-simulation override, a per-simulation inactivity timeout, and scheduling restricted to chosen days and hours. **June 30th, 2026** ## CHIRP playback acknowledgments The CHIRP websocket protocol gained a mark message: agents integrating over CHIRP receive playback acknowledgments confirming when queued audio has actually been played to the caller, enabling precise turn-taking and barge-in handling. [Websocket connections](/integrations/websockets) **June 23rd, 2026** ## Google Dialogflow CX integration Run simulations against Dialogflow CX agents end-to-end. Connect your Google Cloud project via Service Account key, point Bluejay at your CX agent, and Bluejay handles session orchestration, audio transport, and evaluation. Outbound dialing, per-agent CES region, and CX-specific dispatch are all supported. [Dialogflow CX simulations](/integrations/google-dfcx) **June 23rd, 2026** ## Kore.ai integration Bluejay now integrates with Kore.ai for both simulations and observability. Connect your Kore platform host, bot ID, and webhook app credentials on the agent's connection settings to start testing Kore-powered conversational agents. [Kore.ai integration](/integrations/kore) **June 16th, 2026** ## Retell outbound support Retell-connected agents can now run as outbound. Bluejay auto-derives the agent's type (inbound vs. outbound) from your Retell bindings on sync, provisions always-on SIP for outbound Digital Humans, and preserves the synced phone number across connection saves. Outbound Digital Humans default to *not* speaking first. [Retell integration](/integrations/retell) **June 16th, 2026** ## Retell observability + simulations refresh We rewrote the Retell Observability page around the new UI flow and expanded the Retell Simulations guide with quick-sync steps, metrics coverage, and updated walkthroughs. [Retell Observability](/integrations/retell) · [Retell Simulations](/simulation-integrations/retell) **June 16th, 2026** ## Vapi simulations Run simulations directly against Vapi assistants. Bluejay connects to your Vapi assistant, drives the conversation with a Digital Human, and evaluates the resulting transcript with your custom metrics. [Vapi simulations](/simulation-integrations/vapi) **June 9th, 2026** ## Audio quality metrics (Tyto risk score) Call logs now include a Tyto **`risk_score`** as a headline audio-quality signal alongside latency and custom metrics. The score is plumbed end-to-end through the eval DTOs and aggregated on the call logs view so you can sort and filter production conversations by audio risk. [Logs](/monitor/logs) **June 9th, 2026** ## PagerDuty alert channel Threshold alarms can now page on-call via PagerDuty Events API v2 in addition to Slack, email, and webhook. Connect your PagerDuty integration key on the notifications page and route specific alarms to PagerDuty for incident-grade escalation. [Alerts overview](/monitor/alerts) **June 9th, 2026** ## Percentage alarms + simulation alerts Threshold alarms now support **percentage-based** thresholds (e.g. alert when goal success drops below 80% of calls) in addition to absolute values, and you can scope alarms to **simulation metrics** as well as observability. Percentage alarms gracefully recover when no agents have calls in the window. [Alerts overview](/monitor/alerts) **June 2nd, 2026** ## Customer Journeys Customer Journeys let you chain multiple simulated calls into a single multi-step scenario, with prior-call context (entities, knowledge, and state) carried across steps. Build journeys from the dashboard or define them in Bluejay-as-Code. [Customer Journeys guide](/test/simulation-types/customer-journeys) · [Bluejay-as-Code](/bluejay-as-code/overview) **June 2nd, 2026** ## Voice cloning in simulations Digital Humans can now speak with a cloned voice during simulations. Upload a voice sample on the Digital Human, and Bluejay will use that cloned voice for all simulation runs — useful for accent coverage, brand-voice testing, and replicating known caller profiles. [Digital Humans overview](/test/simulations/digital-humans) **June 2nd, 2026** ## Custom background noise Upload your own background noise audio to play under simulation calls. Test how your agent handles call-center hum, traffic, household noise, or any acoustic environment you care about, instead of relying only on the built-in profiles. [Simulations overview](/test/simulations/create) **May 26th, 2026** ## Bulk CSV upload for Digital Humans Create Digital Humans in bulk by uploading a CSV from the Digital Humans page. Each row maps to one Digital Human (persona, scenario, traits, and success criteria), so you can stand up large evaluation populations without scripting against the API. [Digital Humans overview](/test/simulations/digital-humans) **May 26th, 2026** ## New voice accents Expanded voice coverage for Digital Humans: * **UK English** — Scottish, Irish, and Welsh accents * **Korean** — new locale support Voices resolve from atomic language, accent, and gender attributes, so existing agents pick up new options automatically. **May 19th, 2026** ## Scenario Builder split from Workflows We split **Scenario Builder** (single-agent conversational scripts) from **Workflows** (multi-agent automation pipelines) across the docs and API reference. The Workflows API was renamed to the Scenario Builder API where it referred to single-agent scenarios; multi-agent workflow endpoints stay under Workflows. [Scenario Builder overview](/test/simulation-types/scenario-adherence) · [Workflows overview](/test/simulations/create) **May 19th, 2026** ## Simulation Statuses reference Added a dedicated **Simulation Statuses** reference page covering every terminal status, the error codes that map to each failure bucket, and what to do when a simulation lands in System Error. Useful when triaging failed runs or building dashboards on top of the API. [Simulation statuses](/test/simulations/reference#call-statuses) **April 23rd, 2026** ## DTMF tool for Digital Humans Digital Humans can now be configured to send DTMF tones during a call via a new **`allow_dtmf_tool`** field, aligned with how **`allow_end_call_tool`** and **`allow_silence_tool`** are stored and returned. Create and bulk-create default to `allow_dtmf_tool: true` when omitted; updates treat the field as optional (omit to leave unchanged). OpenAPI schemas **`DigitalHumanRequestData`**, **`DigitalHumanResponseData`**, and **`UpdateDigitalHumanRequest`** include the new property. [Create Digital Human](/api-reference/endpoint/create-digital-human) · [Update Digital Human](/api-reference/endpoint/update-digital-human) **April 23rd, 2026** ## Runs per Digital Human Simulations now support executing multiple runs for each selected Digital Human in a single batch. Set **`runs_per_digital_human`** on the simulation (persisted in `experiments.settings`) to control the default, or pass an explicit per-run override when queuing a run. Values must be positive integers; when unset, each Digital Human runs once. The Bluejay dashboard exposes the new control on the simulation settings page and the "Create simulation" and "Create new run" dialogs. [Simulations overview](/test/simulations/create) **April 23rd, 2026** ## Digital Human intelligence upgrade We upgraded the reasoning quality of Digital Humans during both simulations and observability replays. Expect more coherent multi-turn behavior, better adherence to persona and objectives, and steadier tool-use decisions across longer conversations. No configuration changes are required — the upgrade applies automatically to all Digital Humans. [Digital Humans overview](/test/simulations/digital-humans) **April 23rd, 2026** ## Scripted silence in workflows When a Digital Human is running in workflow mode, the silence tool now evaluates only at end-of-turn instead of firing from timeout-based checks mid-turn. This removes a class of false silence triggers on scripted workflow steps and keeps silence decisions aligned with the workflow's turn boundaries. Non-workflow Digital Humans are unchanged. [Workflows overview](/test/simulations/create) **April 23rd, 2026** ## Workflow latency fix Fixed a latency regression in workflow-mode conversations where session-handler state could delay turn transitions. Workflow runs now advance between agent and user turns without the extra wait, improving perceived responsiveness on branching paths. [Workflows overview](/test/simulations/create) **April 14th, 2026** ## Digital Human: silence tool fields Digital Human create, read, update, delete, and bulk APIs now expose **`allow_silence_tool`** and **`silence_tool_instructions`**, aligned with how **`allow_end_call_tool`** and **`hangup_instructions`** are stored and returned. Create and bulk-create default to `allow_silence_tool: false` and `silence_tool_instructions: "default"` when omitted; updates treat fields as optional (omit to leave unchanged). OpenAPI schemas **`DigitalHumanRequestData`**, **`DigitalHumanResponseData`**, and **`UpdateDigitalHumanRequest`** include the new properties. [Create Digital Human](/api-reference/endpoint/create-digital-human) · [Update Digital Human](/api-reference/endpoint/update-digital-human) **April 3rd, 2026** ## Redesigned Workflows Workflows are a structured way to test your agent along a conversation path. * **Agent and user turns** — you define what the agent should say or do (so simulations can check it) and what the Digital Human says on each step. * **Branching** — **options** nodes capture different things the caller might do next (speech, DTMF, silence). * **Coverage** — each distinct path through the graph becomes its own Digital Human, so every branch gets exercised. * **Docs** — cookbook and API reference refreshed; older workflow endpoints are under **Deprecated**. [Create scenario](/api-reference/endpoint/create-scenario) · [Cookbook](/cookbook/scenario-builder) **March 22nd, 2026** ## Revamped documentation We completely overhauled the Bluejay docs with improved navigation, expanded guides, and new content across the board. Highlights include: * **Restructured navigation** with dedicated tabs for Documentation, API Reference, and Changelog * **Expanded integration guides** covering all supported providers and simulation transports * **Cookbook recipes** for common workflows like GitHub Actions CI, API-driven evaluations, and webhook setup [Explore the docs](/) **March 20th, 2026** ## SMS simulation support Bluejay now supports SMS-based simulations, enabling you to test text-based agent flows end-to-end. Configure SMS simulations the same way you configure voice simulations — define Digital Humans, set up custom metrics, and run batch evaluations against your SMS agent. SMS simulations support all existing integrations including telephony providers and HTTP webhooks. [Read the docs](/test/simulations/create) **March 15th, 2026** ## Threshold alarms Set threshold-based alarms on any custom metric to get alerted when agent performance degrades. Define upper or lower bounds, choose your notification channel (Slack, email, or webhook), and Bluejay will trigger alerts automatically when production metrics cross your thresholds. Alarms work across both observability and simulation metrics, so you can catch regressions in production and in testing. [Read the docs](/monitor/alerts) **March 14th, 2026** ## Faster call log evaluation We made significant performance improvements to the observability evaluation pipeline: * **3x faster evaluation** for call logs with custom metrics * **Parallel metric execution** — multiple custom metrics now evaluate concurrently instead of sequentially * **Reduced API latency** for the `/evaluate` and `/re-evaluate` endpoints by approximately 40% These improvements apply automatically to all existing observability configurations. [Read the docs](/monitor/logs) **March 10th, 2026** ## Miro integration for simulation visualization You can now connect Bluejay to Miro to automatically generate visual conversation flow diagrams from your simulation results. Each simulation run produces a Miro board showing the conversation tree, branching paths, and metric outcomes. Connect your Miro workspace from the Integrations page in your Bluejay dashboard. [Read the docs](/test/simulation-types/scenario-adherence#build-a-scenario) **March 3rd, 2026** ## Workflow scheduling improvements Workflows now support cron-based scheduling with finer granularity. You can schedule simulation runs and observability evaluations to execute at specific intervals — hourly, daily, or on a custom cron expression. Additional improvements include: * Retry logic for failed workflow steps * Execution history with detailed step-level logs * Webhook notifications on workflow completion or failure [Read the docs](/test/simulations/create) **February 24th, 2026** ## Community-based simulation runs You can now run simulations against an entire community of Digital Humans in a single batch. Previously, simulations ran against individual Digital Humans or manually selected groups. Community-based runs let you test your agent against a diverse, pre-configured population in one click. Combine communities with custom metrics to get aggregate performance scores across demographic segments, persona types, or behavioral profiles. [Read the docs](/test/simulations/digital-humans#communities) **February 17th, 2026** ## Custom metric formulas Custom metrics now support formula-based definitions in addition to LLM-as-a-Judges. Define metrics using arithmetic expressions over existing metric scores, enabling composite metrics like weighted averages or pass/fail thresholds without writing evaluation prompts. Formula metrics evaluate instantly and do not consume LLM credits. [Read the docs](/test/metrics) **February 10th, 2026** ## Pipecat integration Bluejay now integrates natively with Pipecat for running simulations against Pipecat-powered voice agents. Connect your Pipecat pipeline endpoint and Bluejay will handle session orchestration, audio transport, and evaluation. [Read the docs](/integrations/pipecat) **February 3rd, 2026** ## Knowledge base versioning API The Knowledge Base API lets you create knowledge bases, add documents, and attach them to agents. Knowledge bases ground your agents' answers and power hallucination detection during evaluation. [Read the docs](/api-reference/endpoint/create-knowledge-base) **January 27th, 2026** ## Dashboard redesign We redesigned the Bluejay dashboard with a focus on surfacing actionable insights. The new layout includes: * **At-a-glance health scores** for each agent across simulation and production metrics * **Trend sparklines** showing metric performance over time * **Alert badges** highlighting agents that need attention * **Quick-launch actions** for running simulations and viewing recent call logs The redesign is live for all users. [Read the docs](/monitor/dashboards) **January 20th, 2026** ## ElevenLabs observability integration Bluejay now supports direct observability integration with ElevenLabs Conversational AI. Connect your ElevenLabs account to automatically ingest call logs, evaluate them with custom metrics, and surface quality issues in your dashboard. [Read the docs](/integrations/eleven-labs) **January 13th, 2026** ## Digital Human generation improvements The Digital Human generation engine has been upgraded with better persona diversity and more realistic conversational styles: * **Expanded trait library** with 40+ new customer traits including emotional tone, technical proficiency, and communication preferences * **Scenario-aware generation** — Digital Humans now adapt their behavior based on the simulation scenario context * **Bulk generation** — generate up to 100 Digital Humans in a single API call [Read the docs](/test/simulations/digital-humans) **January 6th, 2026** ## Slack alerting integration Connect Bluejay to Slack to receive real-time alerts when production metrics drop below thresholds or simulation runs complete. Configure per-channel routing so the right team gets the right alerts. [Read the docs](/monitor/alerts#connect-a-channel) **December 16th, 2025** ## WebSocket simulation support Bluejay now supports WebSocket-based simulations for testing real-time, bidirectional agent communication. Configure your WebSocket endpoint, define the message protocol, and run simulations with full transcript capture and metric evaluation. [Read the docs](/integrations/websockets) **December 9th, 2025** ## Prompt versioning and labels The Prompt API now supports versioning and labeling. Create multiple versions of a prompt, tag them with labels like `production` or `staging`, and reference them by label in your agent configuration. Roll back to any previous version instantly. [Read the docs](/api-reference/endpoint/create-prompt-version) **December 2nd, 2025** ## Webhook-based log ingestion You can now send call logs to Bluejay via webhook for evaluation. Configure a webhook endpoint in your dashboard, point your agent platform at it, and Bluejay will automatically ingest, evaluate, and store the results. This is the fastest way to get observability running if your platform isn't covered by a native integration. [Read the docs](/api-reference/webhooks) **November 25th, 2025** ## LiveKit simulation integration Run simulations against LiveKit-powered voice agents. Bluejay connects to your LiveKit room, manages participant sessions, and captures full audio transcripts for evaluation. [Read the docs](/simulation-integrations/livekit) **November 18th, 2025** ## Metrics Lab Introducing Metrics Lab — an interactive environment for prototyping and testing custom metrics before deploying them. Write evaluation prompts, test them against sample transcripts, and iterate on scoring criteria without affecting production data. [Read the docs](/test/metrics/metrics-lab) **November 11th, 2025** ## Folder-based agent organization Agents can now be organized into folders for better workspace management. Create folders, move agents between them, and filter your agent list by folder. Folders are available in both the dashboard and the API. [Read the docs](/api-reference/endpoint/create-folder) **November 4th, 2025** ## Retell observability integration Bluejay now integrates directly with Retell for production call monitoring. Connect your Retell account to automatically pull call logs, run evaluations, and track agent performance over time. [Read the docs](/integrations/retell) **October 21st, 2025** ## Vapi observability integration Bluejay now integrates with Vapi for production call monitoring. Connect your Vapi account to automatically ingest call logs, run custom metric evaluations, and track agent quality over time. [Read the docs](/integrations/vapi) **October 7th, 2025** ## Bland observability integration You can now connect Bluejay to Bland for production observability. Call logs from your Bland-powered agents are automatically ingested, evaluated against your custom metrics, and surfaced in the dashboard. [Read the docs](/integrations/bland) **September 29th, 2025** ## Communities and workflows API endpoints New API endpoint groups for managing communities and workflows: * **Communities** — create, update, add members, list, and delete communities programmatically * **Workflows** — define, schedule, and manage automation workflows through the API [Read the docs](/api-reference/introduction) **September 22nd, 2025** ## SIP simulation integration Bluejay now supports SIP-based simulations. Connect your SIP trunk and run simulations directly over the SIP protocol, enabling testing for enterprise telephony deployments and contact center agents. [Read the docs](/integrations/sip) **September 15th, 2025** ## Telephony simulation support Run simulations over PSTN by connecting your telephony provider to Bluejay. Dial into your agent's phone number, capture the full conversation, and evaluate it with custom metrics — all without changing your agent's infrastructure. [Read the docs](/simulation-integrations/telephony) **September 1st, 2025** ## Observability and evaluation API endpoints New API endpoint groups for observability and evaluation workflows: * **Observability** — evaluate and re-evaluate call logs, manage call log lifecycle * **Custom Metrics** — create, bulk-create, update, list, and delete custom metrics via API [Read the docs](/api-reference/introduction) **August 18th, 2025** ## Digital Humans and simulation runs API endpoints New API endpoint groups for simulation orchestration: * **Digital Humans** — create, generate, update, list, and manage Digital Human personas * **Simulation Runs** — queue voice and SMS runs, retrieve results, and manage active conversations [Read the docs](/api-reference/introduction) **August 4th, 2025** ## Agents and simulations API endpoints The first set of public API endpoints is now available: * **Agents** — create, update, list, move, and delete agents * **Simulations** — create, configure, list, and manage simulations programmatically These endpoints form the foundation of the Bluejay API and enable full automation of your testing pipeline. [Read the docs](/api-reference/introduction) **July 21st, 2025** ## Digital Human personas Introducing Digital Humans — synthetic customer personas that power Bluejay simulations. Define demographic profiles, personality traits, communication styles, and scenario-specific behaviors to create realistic test conversations at scale. [Read the docs](/test/simulations/digital-humans) **July 7th, 2025** ## Simulation engine The Bluejay simulation engine is live. Run synthetic conversations against your voice agents to validate behavior before production. Define scenarios, assign Digital Humans, and evaluate performance with custom metrics. [Read the docs](/test/simulations/create) **June 23rd, 2025** ## Observability pipeline Bluejay's observability pipeline is now available. Ingest production call logs, evaluate them against custom metrics, and surface quality trends in the dashboard. Supports both API-based and webhook-based log ingestion. [Read the docs](/monitor/logs) **June 9th, 2025** ## Custom metrics engine Define custom evaluation criteria tailored to your use case. Bluejay's custom metrics engine supports LLM-as-a-Judge evaluations with configurable scoring rubrics, pass/fail thresholds, and dynamic variables that adapt to conversation context. [Read the docs](/test/metrics) **May 19th, 2025** ## Agent management and dashboard The Bluejay dashboard is live. Create and manage your conversational AI agents, view performance summaries, and navigate your workspace from a central hub. [Read the docs](/test/simulations/create#connect-your-agent) **April 28th, 2025** ## Evaluation framework Bluejay's evaluation framework is ready. Score agent conversations using structured rubrics, capture per-turn and per-call metrics, and generate evaluation reports. This framework underpins both simulation testing and production observability. **April 7th, 2025** ## Core platform infrastructure The foundational Bluejay platform is up and running — authentication, workspace management, and the base API layer. This milestone sets the stage for all product features to follow. # A/B Test Two Agents Source: https://docs.getbluejay.ai/cookbook/ab-test-agents Compare two agents on the same callers. Use this when you have two agents for the same job, for example on two voice platforms or with two different prompts. Both run against the same Digital Humans and custom metrics, so the agent is the only difference between the runs. ## Before you start * Connect both agents to Bluejay. See [Connect your agent](/test/simulations/create#connect-your-agent). * Create the [custom metrics](/test/metrics) you want to compare the agents on. In each metric's **Agents** field, select both agents. A metric that does not include an agent is not scored for it, so the comparison has nothing to show for that agent. ![The Create Metric dialog with a Pass/Fail metric and two agents selected in the Agents field](https://mintcdn.com/bluejay/UqiH6o220FskMm0H/images/cookbook-ab-test-metric-agents.png?fit=max\&auto=format\&n=UqiH6o220FskMm0H\&q=85\&s=49710dd352d2c4d977fbf3289a8bc1b2) ## Run both agents **1. Run agent A** On **Simulations**, create a simulation for the first agent with any [simulation type](/test/simulations/create#create-a-simulation). Under **Custom Metric Settings**, select the metrics you want to compare, then run it. ![The Custom Metric Settings tab of the Create Simulation dialog, with the Select all and Clear all buttons and the count of selected metrics](https://mintcdn.com/bluejay/UqiH6o220FskMm0H/images/cookbook-ab-test-agent-a-metrics.png?fit=max\&auto=format\&n=UqiH6o220FskMm0H\&q=85\&s=8bff508c2427f88bf39d05b40d56e86e) **2. Run agent B on the same Digital Humans** Create a second simulation for the other agent and select the **Use Previous Digital Humans** type. Pick the Digital Humans from agent A's simulation, or the Community that holds them, so both agents face the same callers. Bluejay runs them as they are and does not generate new ones. ![Use Previous Digital Humans card in the Create Simulation type picker](https://mintcdn.com/bluejay/EeUk0hD_moG9tWmI/images/create-simulation-card-previous-digital-humans.png?fit=max\&auto=format\&n=EeUk0hD_moG9tWmI\&q=85\&s=c6743e97118c240a2ce98ec21ab49500) Under **Custom Metric Settings**, select the same metrics as for agent A, then run it. Different metrics make the runs impossible to compare. ## Compare the runs **1. Stage the run from each simulation** Open the first simulation, select its run in **Run History**, and click **Compare Runs**. Do the same in the second simulation. Compare is unavailable until at least 2 runs are staged. ![Run History with one run checked and the Compare Runs button enabled](https://mintcdn.com/bluejay/UqiH6o220FskMm0H/images/cookbook-ab-test-run-history.png?fit=max\&auto=format\&n=UqiH6o220FskMm0H\&q=85\&s=5d660bf48cfa3a6296dc141fe6ad810d) The tray at the bottom of the screen keeps staged runs while you move between simulations. A full page reload clears it, so select the runs again if that happens. **2. Open the comparison** Expand the tray to check that it holds one run per agent, then click **Compare**. Bluejay opens **Compare Runs Across Agents**. ![The expanded compare tray with one run from each of two agents and the Compare button](https://mintcdn.com/bluejay/UqiH6o220FskMm0H/images/cookbook-ab-test-tray.png?fit=max\&auto=format\&n=UqiH6o220FskMm0H\&q=85\&s=3e2cf2ef1c0fb7f0b3777d69af7a0f53) **3. Read it one metric at a time** Set **Compare by** to one custom metric to see which agent fails which check. Start with **Custom metrics passed (summary)** to see which agent passes more overall. A metric with a free-text or JSON result does not appear in **Compare by**, because its results have no value to compare. ## Related * [Previous Digital Humans](/test/simulation-types/previous-digital-humans) * [Create a Simulation](/test/simulations/create) * [Simulation Results](/test/simulations/create#read-the-results) * [Digital Human Reference](/test/simulations/digital-humans) * [Metrics](/test/metrics) # Watch Your Agent After Hours Source: https://docs.getbluejay.ai/cookbook/after-hours-uptime Get paged when your agent breaks after hours. Set up an [uptime monitor](/monitor/uptime/overview) that calls your agent every 10 minutes around the clock and pages your on-call team when it stops answering or starts stating errors.