Roark · Schema

SimulationJobResponse

Simulation job with related entities

CompanyVoiceAITestingEvaluationBenchmarking

Properties

Name Type Description
simulationJobId string Simulation job ID
status string Job status. `RETRY_SCHEDULED` is a retry of a simulation your agent never spoke on, waiting out the plan’s `noResponseRetryBackoffSeconds` before it dials.
processingStatus string Processing status
queuePosition integernull This simulation's 1-based place in its run's queue, in the order the queue releases simulations. Null unless the status is QUEUED.
callId stringnull ID of the call created for this simulation job. Null if the call has not been created yet.
roarkPhoneNumber stringnull Phone number provisioned by Roark for this simulation job in E.164 format. Null if the simulation job is queued and has not been assigned a phone number yet.
runPlan object
enrichment object
invalidation object Null while the result counts. See SimulationJobInvalidation.
failureOwner stringnull Who a FAILED or TIMED_OUT job failed because of. Null when the job did not fail. `AGENT`: your agent under test did not answer, was busy, declined, hung up or went silent, or its outbound-dial HTTP en
retryOfSimulationJobId stringnull The simulation this one retries, because your agent never spoke on it. Null on a test case’s first attempt.
attemptNumber integer This simulation’s place among its test case’s attempts: 1 for the first, 2 for the first retry. Above 1 only when the plan retries simulations your agent never spoke on.
scheduledAt stringnull When a `RETRY_SCHEDULED` retry dials, ISO 8601. Null on a first attempt.
persona object
backgroundNoise object
scenario object
agentEndpoint object
createdAt string When the job was created
startedAt stringnull When the job started
completedAt stringnull When the job completed
View JSON Schema on GitHub

JSON Schema

roark-simulation-job-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/roark/json-schema/roark-simulation-job-response-schema.json",
  "title": "SimulationJobResponse",
  "description": "Simulation job with related entities",
  "x-generated": "2026-10-29",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/roark-openapi.json#/components/schemas/SimulationJobResponse",
  "type": "object",
  "properties": {
    "simulationJobId": {
      "type": "string",
      "format": "uuid",
      "description": "Simulation job ID"
    },
    "status": {
      "type": "string",
      "description": "Job status. `RETRY_SCHEDULED` is a retry of a simulation your agent never spoke on, waiting out the plan’s `noResponseRetryBackoffSeconds` before it dials."
    },
    "processingStatus": {
      "type": "string",
      "description": "Processing status"
    },
    "queuePosition": {
      "type": [
        "integer",
        "null"
      ],
      "exclusiveMinimum": 0,
      "description": "This simulation's 1-based place in its run's queue, in the order the queue releases simulations. Null unless the status is QUEUED."
    },
    "callId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "ID of the call created for this simulation job. Null if the call has not been created yet."
    },
    "roarkPhoneNumber": {
      "type": [
        "string",
        "null"
      ],
      "description": "Phone number provisioned by Roark for this simulation job in E.164 format. Null if the simulation job is queued and has not been assigned a phone number yet."
    },
    "runPlan": {
      "$ref": "#/$defs/SimulationRunPlanRef"
    },
    "enrichment": {
      "$ref": "#/$defs/SimulationJobEnrichment"
    },
    "invalidation": {
      "oneOf": [
        {
          "$ref": "#/$defs/SimulationJobInvalidation"
        },
        {
          "type": "null"
        }
      ],
      "description": "Null while the result counts. See SimulationJobInvalidation."
    },
    "failureOwner": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "ROARK",
        "AGENT"
      ],
      "description": "Who a FAILED or TIMED_OUT job failed because of. Null when the job did not fail. `AGENT`: your agent under test did not answer, was busy, declined, hung up or went silent, or its outbound-dial HTTP endpoint refused. This is a real result. `ROARK`: the simulation itself failed on the Roark platform (pipeline, capacity or analysis). It says nothing about your agent, and the run report leaves these jobs out of every count."
    },
    "retryOfSimulationJobId": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "The simulation this one retries, because your agent never spoke on it. Null on a test case’s first attempt."
    },
    "attemptNumber": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "description": "This simulation’s place among its test case’s attempts: 1 for the first, 2 for the first retry. Above 1 only when the plan retries simulations your agent never spoke on."
    },
    "scheduledAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "When a `RETRY_SCHEDULED` retry dials, ISO 8601. Null on a first attempt."
    },
    "persona": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "Unique identifier of the persona"
        },
        "name": {
          "type": "string",
          "description": "The name the agent will identify as during conversations"
        },
        "displayName": {
          "type": [
            "string",
            "null"
          ],
          "description": "Label shown in place of the name across the dashboard (e.g. a short descriptor like \"Irate Escalator\"). The persona still identifies as `name` on calls. Omit or set null to display the name itself."
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "Human-readable description of the persona"
        },
        "language": {
          "type": "string",
          "enum": [
            "EN",
            "ES",
            "DE",
            "HI",
            "FR",
            "NL",
            "AR",
            "EL",
            "IT",
            "ID",
            "TH",
            "JA",
            "TL",
            "MS",
            "ZH",
            "TR",
            "PT",
            "HE"
          ],
          "description": "Primary language ISO 639-1 code for the persona"
        },
        "secondaryLanguage": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "EN"
          ],
          "description": "Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)"
        },
        "understoodLanguages": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "EN",
              "ES",
              "DE",
              "HI",
              "FR",
              "NL",
              "AR",
              "EL",
              "IT",
              "ID",
              "TH",
              "JA",
              "TL",
              "MS",
              "ZH",
              "TR",
              "PT",
              "HE"
            ]
          },
          "minItems": 1,
          "description": "Languages the persona can understand. Multilingual combinations are limited by multilingual speech recognition support."
        },
        "accent": {
          "type": "string",
          "enum": [
            "US",
            "US_X_SOUTH",
            "GB",
            "ES",
            "DE",
            "IN",
            "FR",
            "NL",
            "SA",
            "GR",
            "AU",
            "IT",
            "ID",
            "TH",
            "JP",
            "NZ",
            "PH",
            "SG",
            "MY",
            "HK",
            "TR",
            "PT",
            "IL"
          ],
          "description": "Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with optional variants"
        },
        "age": {
          "type": "string",
          "enum": [
            "CHILD",
            "TEENAGER",
            "ADULT",
            "ELDERLY"
          ],
          "default": "ADULT",
          "description": "How old the caller sounds and behaves. Only ages the persona's accent has a voice for are accepted; defaults to ADULT, which every accent supports."
        },
        "gender": {
          "type": "string",
          "enum": [
            "MALE",
            "FEMALE"
          ],
          "description": "Gender of the persona"
        },
        "backgroundNoise": {
          "type": "string",
          "enum": [
            "NONE",
            "AIRPORT",
            "CHILDREN_PLAYING",
            "CITY",
            "COFFEE_SHOP",
            "CONSTRUCTION",
            "CRYING_BABY",
            "DRIVING",
            "LIBRARY",
            "OFFICE",
            "THUNDERSTORM",
            "TRAIN"
          ],
          "default": "NONE",
          "description": "Background noise setting"
        },
        "speechPace": {
          "type": "string",
          "enum": [
            "SUPER_SLOW",
            "SLOW",
            "NORMAL",
            "FAST",
            "SUPER_FAST"
          ],
          "default": "NORMAL",
          "description": "Speech pace of the persona"
        },
        "speechClarity": {
          "type": "string",
          "enum": [
            "CLEAR",
            "VAGUE",
            "RAMBLING"
          ],
          "default": "CLEAR",
          "description": "Speech clarity of the persona"
        },
        "hasDisfluencies": {
          "type": "boolean",
          "default": false,
          "description": "Whether the persona uses filler words like \"um\" and \"uh\""
        },
        "baseEmotion": {
          "type": "string",
          "enum": [
            "NEUTRAL",
            "CHEERFUL",
            "CONFUSED",
            "FRUSTRATED",
            "SKEPTICAL",
            "RUSHED",
            "DISTRACTED",
            "ANGRY",
            "ANXIOUS",
            "SAD"
          ],
          "default": "NEUTRAL",
          "description": "Base emotional state of the persona"
        },
        "intentClarity": {
          "type": "string",
          "enum": [
            "CLEAR",
            "INDIRECT",
            "VAGUE"
          ],
          "default": "CLEAR",
          "description": "How clearly the persona expresses their intentions"
        },
        "confirmationStyle": {
          "type": "string",
          "enum": [
            "EXPLICIT",
            "VAGUE"
          ],
          "default": "EXPLICIT",
          "description": "How the persona confirms information"
        },
        "memoryReliability": {
          "type": "string",
          "enum": [
            "HIGH",
            "LOW"
          ],
          "default": "HIGH",
          "description": "How reliable the persona's memory is"
        },
        "responseTiming": {
          "type": "string",
          "enum": [
            "RELAXED",
            "NORMAL",
            "QUICK",
            "BARGE_IN"
          ],
          "default": "NORMAL",
          "description": "Deprecated and inert: it no longer affects the call. It set how long the persona waited once the agent stopped talking, and measured across production simulations it moved the reply gap by less than the noise floor, because model and speech latency dominate it. Every persona now uses one voice-activity profile. Use `interruption` for a caller who talks over the agent. Still accepted and stored so existing clients keep working. BARGE_IN is stored as `responseTiming: QUICK` with `interruption: OCCASIONAL`."
        },
        "interruption": {
          "type": "string",
          "enum": [
            "OFF",
            "BACKCHANNEL",
            "OCCASIONAL",
            "HEAVY"
          ],
          "default": "OFF",
          "description": "How much the persona talks over the agent while it is still speaking. OFF waits its turn. BACKCHANNEL makes listening noises (\"mm-hm\") over the agent without taking the floor, which tests whether the agent wrongly stops for them. OCCASIONAL adds cutting in on some long agent turns, HEAVY on most of them. Timing is randomised per turn, so two runs of the same persona do not interrupt at identical moments."
        },
        "backstoryPrompt": {
          "type": [
            "string",
            "null"
          ],
          "description": "Background story and behavioral patterns for the persona"
        },
        "idleMessages": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          },
          "description": "Messages the persona will say when the agent goes silent during a call. null = \"Automatic\": language-appropriate defaults are used at call time."
        },
        "idleTimeoutSeconds": {
          "type": "integer",
          "minimum": 5,
          "maximum": 60,
          "default": 10,
          "description": "Seconds of silence before the persona sends an idle message"
        },
        "idleMessageMaxSpokenCount": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10,
          "default": 3,
          "description": "Maximum number of idle messages the persona will send before giving up"
        },
        "idleMessageResetCountOnUserSpeechEnabled": {
          "type": "boolean",
          "default": true,
          "description": "Whether the idle message counter resets when the agent speaks"
        },
        "properties": {
          "type": "object",
          "additionalProperties": {},
          "default": {},
          "description": "Additional custom properties about the persona"
        },
        "phoneNumber": {
          "type": "string",
          "description": "The E.164 number every call with this persona uses, when Roark has pinned one for your project. Present only when set; read-only."
        },
        "createdAt": {
          "type": "string",
          "description": "Creation timestamp"
        },
        "updatedAt": {
          "type": "string",
          "description": "Last update timestamp"
        }
      },
      "required": [
        "id",
        "name",
        "language",
        "understoodLanguages",
        "accent",
        "age",
        "gender",
        "backgroundNoise",
        "speechPace",
        "speechClarity",
        "hasDisfluencies",
        "baseEmotion",
        "intentClarity",
        "confirmationStyle",
        "memoryReliability",
        "responseTiming",
        "interruption",
        "idleMessages",
        "idleTimeoutSeconds",
        "idleMessageMaxSpokenCount",
        "idleMessageResetCountOnUserSpeechEnabled",
        "properties",
        "createdAt",
        "updatedAt"
      ]
    },
    "backgroundNoise": {
      "$ref": "#/$defs/SimulationJobBackgroundNoise"
    },
    "scenario": {
      "$ref": "#/$defs/ScenarioResponse"
    },
    "agentEndpoint": {
      "$ref": "#/$defs/AgentEndpointResponse"
    },
    "createdAt": {
      "type": "string",
      "description": "When the job was created"
    },
    "startedAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the job started"
    },
    "completedAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the job completed"
    }
  },
  "required": [
    "simulationJobId",
    "status",
    "processingStatus",
    "queuePosition",
    "runPlan",
    "enrichment",
    "invalidation",
    "failureOwner",
    "retryOfSimulationJobId",
    "attemptNumber",
    "scheduledAt",
    "persona",
    "backgroundNoise",
    "scenario",
    "agentEndpoint",
    "createdAt"
  ],
  "$defs": {
    "AgentEndpointResponse": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "Agent endpoint ID"
        },
        "name": {
          "type": "string",
          "description": "Agent endpoint name"
        },
        "phoneNumber": {
          "type": [
            "string",
            "null"
          ],
          "description": "Agent endpoint phone number"
        },
        "type": {
          "type": "string",
          "enum": [
            "PHONE",
            "WEBSOCKET",
            "LIVEKIT",
            "SMALL_WEBRTC",
            "ELEVENLABS_WS",
            "KORE",
            "GOOGLE_CES",
            "DAILY"
          ],
          "description": "Agent endpoint type"
        }
      },
      "required": [
        "id",
        "name",
        "phoneNumber",
        "type"
      ],
      "description": "Agent endpoint used in a simulation"
    },
    "ScenarioResponse": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "Scenario ID"
        },
        "description": {
          "type": [
            "string",
            "null"
          ],
          "description": "Scenario description"
        }
      },
      "required": [
        "id"
      ],
      "description": "Scenario used in a simulation"
    },
    "SimulationJobBackgroundNoise": {
      "type": "object",
      "properties": {
        "backgroundNoise": {
          "type": "string",
          "enum": [
            "NONE",
            "AIRPORT",
            "CHILDREN_PLAYING",
            "CITY",
            "COFFEE_SHOP",
            "CONSTRUCTION",
            "CRYING_BABY",
            "DRIVING",
            "LIBRARY",
            "OFFICE",
            "THUNDERSTORM",
            "TRAIN"
          ],
          "description": "The noise bed the simulated caller was placed with. NONE when the call ran in silence."
        },
        "backgroundNoiseVolume": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "description": "Linear gain (0..1) the bed played at. 1 is as loud as the caller’s voice."
        },
        "source": {
          "type": "string",
          "enum": [
            "ENVIRONMENT",
            "PERSONA"
          ],
          "description": "`ENVIRONMENT` when the flow’s environment decided the bed (a sweep arm, or an environment with noise), `PERSONA` when the persona’s own setting did."
        }
      },
      "required": [
        "backgroundNoise",
        "backgroundNoiseVolume",
        "source"
      ],
      "description": "The background noise the call actually ran with. `persona.backgroundNoise` is only what the persona was set to; a flow’s environment overrides it, and on a background-noise sweep every arm’s persona says NONE while the arms differ here. Filter by arm on this field."
    },
    "SimulationJobEnrichment": {
      "type": "object",
      "properties": {
        "requested": {
          "type": "boolean",
          "description": "Whether the run plan asked for the customer's live conversation to be merged into this run."
        },
        "outcome": {
          "type": "string",
          "enum": [
            "NOT_REQUESTED",
            "WAITING",
            "MERGED",
            "TIMED_OUT",
            "SKIPPED",
            "UNKNOWN"
          ],
          "description": "How the wait for the live conversation resolved. `WAITING` means the run is holding open for it right now. `MERGED` means it arrived and live-sourced metrics were scored against it. `TIMED_OUT` and `SKIPPED` both mean it never arrived, so scoring fell back to the simulated side: read `metricsScoredOnSimulationInstead` and `metricsNotCollected` for what that cost. `UNKNOWN` is a run that finished before Roark started recording this."
        },
        "waitStartedAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "When the run began holding open for the live conversation. Null if it never waited."
        },
        "waitEndedAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "When the wait ended, however it ended. Null if it never waited or is still waiting."
        },
        "metricsScoredOnSimulationInstead": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Metrics that asked for the live side and were scored against the simulated side because no live conversation arrived. Null on runs that predate this recording."
        },
        "metricsNotCollected": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Metrics that only support the live side and so were not scored at all. Null on runs that predate this recording."
        }
      },
      "required": [
        "requested",
        "outcome"
      ],
      "description": "What happened to this run's live-conversation enrichment, and what scoring fell back to when none arrived."
    },
    "SimulationJobInvalidation": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string",
          "enum": [
            "SCRIPT_DIVERGED",
            "REQUIRED_STEP_NOT_REACHED",
            "REQUIRED_STAGE_INCOMPLETE",
            "CALLER_NEVER_TOOK_OVER",
            "AGENT_NEVER_SPOKE"
          ],
          "description": "Why the result does not count. `SCRIPT_DIVERGED`: a strict flow went off script at a step whose off-script policy is HANG_UP_INVALIDATE. `REQUIRED_STAGE_INCOMPLETE`: the call ended before it got through a stage its flow requires. `CALLER_NEVER_TOOK_OVER`: the call opened on the persona of a preceding flow, which never handed the phone to the persona under test, so none of that persona's properties were exercised. `AGENT_NEVER_SPOKE`: your agent answered and never said a word (it hung up within seconds, or the line stayed silent until our caller gave up), so there was nothing to grade."
        },
        "detail": {
          "type": [
            "string",
            "null"
          ],
          "description": "One sentence: where the script was left and what your agent did instead."
        },
        "invalidatedAt": {
          "type": "string",
          "description": "When the run was invalidated."
        }
      },
      "required": [
        "reason",
        "invalidatedAt"
      ],
      "description": "Present when the run was invalidated: the call ended before a step its flow requires for a valid run, or a strict flow went off script at a step whose policy invalidates the run. It keeps its transcript and recording, but nothing scored it and it is excluded from every run total."
    },
    "SimulationRunPlanRef": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "Run plan ID"
        },
        "name": {
          "type": "string",
          "description": "Run plan name"
        },
        "variables": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "Run-plan-level variables resolved for this job, keyed by variable name. Values are stringified by their declared type."
        }
      },
      "required": [
        "id",
        "name",
        "variables"
      ]
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/roark-simulation-job-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.