Okareo · Schema
IngestPayload
Top-level ingest request with project context. This is the monitoring path - conversations are ingested and monitored based on filter groups, not associated with a specific MUT like test runs.
CompanyArtificial IntelligenceSynthetic DataVoice AgentsTesting
Properties
| Name | Type | Description |
|---|---|---|
| project_id | string | Okareo project ID |
| mut_id | object | Optional model under test ID. If not provided, datapoints are created without a MUT association (monitoring path). |
| conversations | array | List of conversations to ingest (1+) |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/okareo/json-schema/okareo-ingest-payload-schema.json",
"title": "IngestPayload",
"description": "Top-level ingest request with project context.\n\nThis is the monitoring path - conversations are ingested and monitored\nbased on filter groups, not associated with a specific MUT like test runs.",
"x-generated": "2026-11-10",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/okareo-monitoring-api-openapi.yml#/components/schemas/IngestPayload",
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"title": "Project Id",
"description": "Okareo project ID"
},
"mut_id": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
],
"title": "Mut Id",
"description": "Optional model under test ID. If not provided, datapoints are created without a MUT association (monitoring path)."
},
"conversations": {
"items": {
"$ref": "#/$defs/ConversationIngestRequest"
},
"type": "array",
"title": "Conversations",
"description": "List of conversations to ingest (1+)"
}
},
"type": "object",
"required": [
"project_id",
"conversations"
],
"$defs": {
"ConversationAudio": {
"properties": {
"type": {
"type": "string",
"enum": [
"url",
"voice_file_id",
"inline_b64"
],
"title": "Type",
"description": "Audio reference type"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Url",
"description": "Externally hosted audio URL when type='url'"
},
"voice_file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Voice File Id",
"description": "Existing Okareo voice file identifier when type='voice_file_id'"
},
"inline_b64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Inline B64",
"description": "Base64-encoded audio bytes when type='inline_b64'"
}
},
"type": "object",
"required": [
"type"
],
"title": "ConversationAudio",
"description": "Audio attachment for a conversation ingest request."
},
"ConversationIngestRequest": {
"properties": {
"call_id": {
"type": "string",
"title": "Call Id",
"description": "Platform-specific call identifier"
},
"context_token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Context Token",
"description": "Optional context token for correlation. Defaults to call_id if not provided."
},
"conversation_start_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Conversation Start At",
"description": "Absolute conversation start timestamp in UTC. Use this with per-turn timestamp_ms values to derive wall-clock message times."
},
"audio": {
"anyOf": [
{
"$ref": "#/$defs/ConversationAudio"
},
{
"type": "null"
}
],
"description": "Audio reference for the conversation. Prefer URL or voice_file_id over inline base64."
},
"recording_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Recording Url",
"description": "Legacy compatibility field. Prefer audio={type:'url', url: ...}."
},
"recording_bytes_b64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Recording Bytes B64",
"description": "Legacy compatibility field. Prefer audio={type:'inline_b64', inline_b64: ...}."
},
"transcript": {
"anyOf": [
{
"items": {
"$ref": "#/$defs/ConversationTurn"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Transcript",
"description": "Pre-parsed transcript as a list of turns. Optional for audio-only sources."
},
"diarization": {
"type": "boolean",
"title": "Diarization",
"description": "When transcript is absent, run diarization + ASR on the audio before creating the datapoint.",
"default": true
},
"metadata": {
"additionalProperties": true,
"type": "object",
"title": "Metadata",
"description": "Platform-specific metadata"
},
"tags": {
"items": {
"type": "string"
},
"type": "array",
"title": "Tags",
"description": "Tags for monitor matching"
},
"first_turn": {
"type": "string",
"title": "First Turn",
"description": "For audio-only diarization: 'user' or 'assistant' spoke first",
"default": "assistant"
}
},
"type": "object",
"required": [
"call_id"
],
"title": "ConversationIngestRequest",
"description": "Request payload for ingesting voice conversations."
},
"ConversationTurn": {
"properties": {
"role": {
"type": "string",
"title": "Role",
"description": "Speaker role: 'user' or 'assistant'"
},
"content": {
"type": "string",
"title": "Content",
"description": "Text content of the utterance"
},
"timestamp_ms": {
"type": "integer",
"title": "Timestamp Ms",
"description": "Timestamp in milliseconds from conversation start",
"default": 0
}
},
"type": "object",
"required": [
"role",
"content"
],
"title": "ConversationTurn",
"description": "A single turn in a conversation (user or assistant utterance)."
}
}
}
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.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/okareo-ingest-payload"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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.