Send one agent Playground message
Send one message to a project's MCP servers and get the model's reply plus the telemetry a participant in the conversation could not see: which tools ran, with what arguments, what each returned, per-call latency, and token usage.
Spends model credits per call. idempotencyKey is required and must be STABLE for the triggering intent — a fresh key per HTTP attempt deduplicates nothing, so a timeout-and-retry would run and bill the turn twice. With a stable key, a retry replays the completed turn.
Omit sessionId to start a session; pass the one this returns to continue it. Configuration (modelId, target, systemPrompt, toolMode) pins on the FIRST turn — a continuation that resends any of it is refused with details.reason: "CONFIG_ON_CONTINUATION".
Only sessions created through this endpoint may be continued through it (CONTINUATION_NOT_ALLOWED): appending to a human's live Playground session would interleave two writers on one transcript.
toolMode defaults to read_only, which advertises only tools the server annotated readOnlyHint: true. That hint is server-asserted, so read_only is a policy this host applies, not a guarantee it can verify. auto advertises everything and may cause real external side effects through arbitrary third-party tools.
Pass hostId — or target an environmentId, which pins its own host — to run the turn AS a saved host. That is what selects the ENGINE: a host declaring an agent harness runs the real runtime, and one that cannot run here is refused BEFORE it spends (422, details.reason: "HARNESS_UNAVAILABLE", with details.kind naming the rule that refused) rather than quietly downgraded to the emulated engine. Every response names what actually ran in engine. hostId is per-turn and cannot be pinned, so a continuation of a session that named ONLY a host must re-send it — omitting it is a 400 with details.reason: "HOST_TARGET_REQUIRED", never a quiet fall back to the emulated engine.
Request body
Response
The turn ran. persisted.outcome reports whether the transcript landed — a turn that ran but failed to persist still spent, so this is a 200 with an honest persisted block rather than an error.