curl --request POST \
--url https://api.murmur.dev/v1/agent/queue \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agentId": {
"tenant": {
"provider": "PROVIDER_UNSPECIFIED",
"org": "<string>"
},
"ownerProvider": "PROVIDER_UNSPECIFIED",
"account": "<string>",
"agent": [
"<string>"
],
"workspace": "<string>"
},
"description": "<string>",
"tasks": [
{
"id": "<string>",
"subject": "<string>",
"description": "<string>",
"status": "TASK_STATUS_UNSPECIFIED",
"blocks": [
"<string>"
],
"blockedBy": [
"<string>"
],
"activation": {
"filesModified": {
"pattern": "<string>"
}
},
"persona": "<string>",
"dedupKey": "<string>",
"ephemeral": true
}
],
"agent": "<string>",
"followUpId": "<string>",
"outputSchema": "<string>",
"model": "<string>",
"reasoningEffort": "<string>",
"serviceTier": "<string>",
"fastMode": true,
"preempt": true,
"deliverAt": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.murmur.dev/v1/agent/queue"
payload = {
"agentId": {
"tenant": {
"provider": "PROVIDER_UNSPECIFIED",
"org": "<string>"
},
"ownerProvider": "PROVIDER_UNSPECIFIED",
"account": "<string>",
"agent": ["<string>"],
"workspace": "<string>"
},
"description": "<string>",
"tasks": [
{
"id": "<string>",
"subject": "<string>",
"description": "<string>",
"status": "TASK_STATUS_UNSPECIFIED",
"blocks": ["<string>"],
"blockedBy": ["<string>"],
"activation": { "filesModified": { "pattern": "<string>" } },
"persona": "<string>",
"dedupKey": "<string>",
"ephemeral": True
}
],
"agent": "<string>",
"followUpId": "<string>",
"outputSchema": "<string>",
"model": "<string>",
"reasoningEffort": "<string>",
"serviceTier": "<string>",
"fastMode": True,
"preempt": True,
"deliverAt": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agentId: {
tenant: {provider: 'PROVIDER_UNSPECIFIED', org: '<string>'},
ownerProvider: 'PROVIDER_UNSPECIFIED',
account: '<string>',
agent: ['<string>'],
workspace: '<string>'
},
description: '<string>',
tasks: [
{
id: '<string>',
subject: '<string>',
description: '<string>',
status: 'TASK_STATUS_UNSPECIFIED',
blocks: ['<string>'],
blockedBy: ['<string>'],
activation: {filesModified: {pattern: '<string>'}},
persona: '<string>',
dedupKey: '<string>',
ephemeral: true
}
],
agent: '<string>',
followUpId: '<string>',
outputSchema: '<string>',
model: '<string>',
reasoningEffort: '<string>',
serviceTier: '<string>',
fastMode: true,
preempt: true,
deliverAt: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.murmur.dev/v1/agent/queue', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.murmur.dev/v1/agent/queue",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agentId' => [
'tenant' => [
'provider' => 'PROVIDER_UNSPECIFIED',
'org' => '<string>'
],
'ownerProvider' => 'PROVIDER_UNSPECIFIED',
'account' => '<string>',
'agent' => [
'<string>'
],
'workspace' => '<string>'
],
'description' => '<string>',
'tasks' => [
[
'id' => '<string>',
'subject' => '<string>',
'description' => '<string>',
'status' => 'TASK_STATUS_UNSPECIFIED',
'blocks' => [
'<string>'
],
'blockedBy' => [
'<string>'
],
'activation' => [
'filesModified' => [
'pattern' => '<string>'
]
],
'persona' => '<string>',
'dedupKey' => '<string>',
'ephemeral' => true
]
],
'agent' => '<string>',
'followUpId' => '<string>',
'outputSchema' => '<string>',
'model' => '<string>',
'reasoningEffort' => '<string>',
'serviceTier' => '<string>',
'fastMode' => true,
'preempt' => true,
'deliverAt' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.murmur.dev/v1/agent/queue"
payload := strings.NewReader("{\n \"agentId\": {\n \"tenant\": {\n \"provider\": \"PROVIDER_UNSPECIFIED\",\n \"org\": \"<string>\"\n },\n \"ownerProvider\": \"PROVIDER_UNSPECIFIED\",\n \"account\": \"<string>\",\n \"agent\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"tasks\": [\n {\n \"id\": \"<string>\",\n \"subject\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"TASK_STATUS_UNSPECIFIED\",\n \"blocks\": [\n \"<string>\"\n ],\n \"blockedBy\": [\n \"<string>\"\n ],\n \"activation\": {\n \"filesModified\": {\n \"pattern\": \"<string>\"\n }\n },\n \"persona\": \"<string>\",\n \"dedupKey\": \"<string>\",\n \"ephemeral\": true\n }\n ],\n \"agent\": \"<string>\",\n \"followUpId\": \"<string>\",\n \"outputSchema\": \"<string>\",\n \"model\": \"<string>\",\n \"reasoningEffort\": \"<string>\",\n \"serviceTier\": \"<string>\",\n \"fastMode\": true,\n \"preempt\": true,\n \"deliverAt\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.murmur.dev/v1/agent/queue")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agentId\": {\n \"tenant\": {\n \"provider\": \"PROVIDER_UNSPECIFIED\",\n \"org\": \"<string>\"\n },\n \"ownerProvider\": \"PROVIDER_UNSPECIFIED\",\n \"account\": \"<string>\",\n \"agent\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"tasks\": [\n {\n \"id\": \"<string>\",\n \"subject\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"TASK_STATUS_UNSPECIFIED\",\n \"blocks\": [\n \"<string>\"\n ],\n \"blockedBy\": [\n \"<string>\"\n ],\n \"activation\": {\n \"filesModified\": {\n \"pattern\": \"<string>\"\n }\n },\n \"persona\": \"<string>\",\n \"dedupKey\": \"<string>\",\n \"ephemeral\": true\n }\n ],\n \"agent\": \"<string>\",\n \"followUpId\": \"<string>\",\n \"outputSchema\": \"<string>\",\n \"model\": \"<string>\",\n \"reasoningEffort\": \"<string>\",\n \"serviceTier\": \"<string>\",\n \"fastMode\": true,\n \"preempt\": true,\n \"deliverAt\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.murmur.dev/v1/agent/queue")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agentId\": {\n \"tenant\": {\n \"provider\": \"PROVIDER_UNSPECIFIED\",\n \"org\": \"<string>\"\n },\n \"ownerProvider\": \"PROVIDER_UNSPECIFIED\",\n \"account\": \"<string>\",\n \"agent\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"tasks\": [\n {\n \"id\": \"<string>\",\n \"subject\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"TASK_STATUS_UNSPECIFIED\",\n \"blocks\": [\n \"<string>\"\n ],\n \"blockedBy\": [\n \"<string>\"\n ],\n \"activation\": {\n \"filesModified\": {\n \"pattern\": \"<string>\"\n }\n },\n \"persona\": \"<string>\",\n \"dedupKey\": \"<string>\",\n \"ephemeral\": true\n }\n ],\n \"agent\": \"<string>\",\n \"followUpId\": \"<string>\",\n \"outputSchema\": \"<string>\",\n \"model\": \"<string>\",\n \"reasoningEffort\": \"<string>\",\n \"serviceTier\": \"<string>\",\n \"fastMode\": true,\n \"preempt\": true,\n \"deliverAt\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"followUpId": "<string>"
}{
"code": 123,
"message": "<string>",
"details": [
{
"@type": "<string>"
}
]
}Queue a follow-up
QueueAdd sends a follow-up message to a running agent. Returns NotFound if the agent is not running.
curl --request POST \
--url https://api.murmur.dev/v1/agent/queue \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"agentId": {
"tenant": {
"provider": "PROVIDER_UNSPECIFIED",
"org": "<string>"
},
"ownerProvider": "PROVIDER_UNSPECIFIED",
"account": "<string>",
"agent": [
"<string>"
],
"workspace": "<string>"
},
"description": "<string>",
"tasks": [
{
"id": "<string>",
"subject": "<string>",
"description": "<string>",
"status": "TASK_STATUS_UNSPECIFIED",
"blocks": [
"<string>"
],
"blockedBy": [
"<string>"
],
"activation": {
"filesModified": {
"pattern": "<string>"
}
},
"persona": "<string>",
"dedupKey": "<string>",
"ephemeral": true
}
],
"agent": "<string>",
"followUpId": "<string>",
"outputSchema": "<string>",
"model": "<string>",
"reasoningEffort": "<string>",
"serviceTier": "<string>",
"fastMode": true,
"preempt": true,
"deliverAt": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://api.murmur.dev/v1/agent/queue"
payload = {
"agentId": {
"tenant": {
"provider": "PROVIDER_UNSPECIFIED",
"org": "<string>"
},
"ownerProvider": "PROVIDER_UNSPECIFIED",
"account": "<string>",
"agent": ["<string>"],
"workspace": "<string>"
},
"description": "<string>",
"tasks": [
{
"id": "<string>",
"subject": "<string>",
"description": "<string>",
"status": "TASK_STATUS_UNSPECIFIED",
"blocks": ["<string>"],
"blockedBy": ["<string>"],
"activation": { "filesModified": { "pattern": "<string>" } },
"persona": "<string>",
"dedupKey": "<string>",
"ephemeral": True
}
],
"agent": "<string>",
"followUpId": "<string>",
"outputSchema": "<string>",
"model": "<string>",
"reasoningEffort": "<string>",
"serviceTier": "<string>",
"fastMode": True,
"preempt": True,
"deliverAt": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
agentId: {
tenant: {provider: 'PROVIDER_UNSPECIFIED', org: '<string>'},
ownerProvider: 'PROVIDER_UNSPECIFIED',
account: '<string>',
agent: ['<string>'],
workspace: '<string>'
},
description: '<string>',
tasks: [
{
id: '<string>',
subject: '<string>',
description: '<string>',
status: 'TASK_STATUS_UNSPECIFIED',
blocks: ['<string>'],
blockedBy: ['<string>'],
activation: {filesModified: {pattern: '<string>'}},
persona: '<string>',
dedupKey: '<string>',
ephemeral: true
}
],
agent: '<string>',
followUpId: '<string>',
outputSchema: '<string>',
model: '<string>',
reasoningEffort: '<string>',
serviceTier: '<string>',
fastMode: true,
preempt: true,
deliverAt: '2023-11-07T05:31:56Z'
})
};
fetch('https://api.murmur.dev/v1/agent/queue', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.murmur.dev/v1/agent/queue",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agentId' => [
'tenant' => [
'provider' => 'PROVIDER_UNSPECIFIED',
'org' => '<string>'
],
'ownerProvider' => 'PROVIDER_UNSPECIFIED',
'account' => '<string>',
'agent' => [
'<string>'
],
'workspace' => '<string>'
],
'description' => '<string>',
'tasks' => [
[
'id' => '<string>',
'subject' => '<string>',
'description' => '<string>',
'status' => 'TASK_STATUS_UNSPECIFIED',
'blocks' => [
'<string>'
],
'blockedBy' => [
'<string>'
],
'activation' => [
'filesModified' => [
'pattern' => '<string>'
]
],
'persona' => '<string>',
'dedupKey' => '<string>',
'ephemeral' => true
]
],
'agent' => '<string>',
'followUpId' => '<string>',
'outputSchema' => '<string>',
'model' => '<string>',
'reasoningEffort' => '<string>',
'serviceTier' => '<string>',
'fastMode' => true,
'preempt' => true,
'deliverAt' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.murmur.dev/v1/agent/queue"
payload := strings.NewReader("{\n \"agentId\": {\n \"tenant\": {\n \"provider\": \"PROVIDER_UNSPECIFIED\",\n \"org\": \"<string>\"\n },\n \"ownerProvider\": \"PROVIDER_UNSPECIFIED\",\n \"account\": \"<string>\",\n \"agent\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"tasks\": [\n {\n \"id\": \"<string>\",\n \"subject\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"TASK_STATUS_UNSPECIFIED\",\n \"blocks\": [\n \"<string>\"\n ],\n \"blockedBy\": [\n \"<string>\"\n ],\n \"activation\": {\n \"filesModified\": {\n \"pattern\": \"<string>\"\n }\n },\n \"persona\": \"<string>\",\n \"dedupKey\": \"<string>\",\n \"ephemeral\": true\n }\n ],\n \"agent\": \"<string>\",\n \"followUpId\": \"<string>\",\n \"outputSchema\": \"<string>\",\n \"model\": \"<string>\",\n \"reasoningEffort\": \"<string>\",\n \"serviceTier\": \"<string>\",\n \"fastMode\": true,\n \"preempt\": true,\n \"deliverAt\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.murmur.dev/v1/agent/queue")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"agentId\": {\n \"tenant\": {\n \"provider\": \"PROVIDER_UNSPECIFIED\",\n \"org\": \"<string>\"\n },\n \"ownerProvider\": \"PROVIDER_UNSPECIFIED\",\n \"account\": \"<string>\",\n \"agent\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"tasks\": [\n {\n \"id\": \"<string>\",\n \"subject\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"TASK_STATUS_UNSPECIFIED\",\n \"blocks\": [\n \"<string>\"\n ],\n \"blockedBy\": [\n \"<string>\"\n ],\n \"activation\": {\n \"filesModified\": {\n \"pattern\": \"<string>\"\n }\n },\n \"persona\": \"<string>\",\n \"dedupKey\": \"<string>\",\n \"ephemeral\": true\n }\n ],\n \"agent\": \"<string>\",\n \"followUpId\": \"<string>\",\n \"outputSchema\": \"<string>\",\n \"model\": \"<string>\",\n \"reasoningEffort\": \"<string>\",\n \"serviceTier\": \"<string>\",\n \"fastMode\": true,\n \"preempt\": true,\n \"deliverAt\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.murmur.dev/v1/agent/queue")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"agentId\": {\n \"tenant\": {\n \"provider\": \"PROVIDER_UNSPECIFIED\",\n \"org\": \"<string>\"\n },\n \"ownerProvider\": \"PROVIDER_UNSPECIFIED\",\n \"account\": \"<string>\",\n \"agent\": [\n \"<string>\"\n ],\n \"workspace\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"tasks\": [\n {\n \"id\": \"<string>\",\n \"subject\": \"<string>\",\n \"description\": \"<string>\",\n \"status\": \"TASK_STATUS_UNSPECIFIED\",\n \"blocks\": [\n \"<string>\"\n ],\n \"blockedBy\": [\n \"<string>\"\n ],\n \"activation\": {\n \"filesModified\": {\n \"pattern\": \"<string>\"\n }\n },\n \"persona\": \"<string>\",\n \"dedupKey\": \"<string>\",\n \"ephemeral\": true\n }\n ],\n \"agent\": \"<string>\",\n \"followUpId\": \"<string>\",\n \"outputSchema\": \"<string>\",\n \"model\": \"<string>\",\n \"reasoningEffort\": \"<string>\",\n \"serviceTier\": \"<string>\",\n \"fastMode\": true,\n \"preempt\": true,\n \"deliverAt\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"followUpId": "<string>"
}{
"code": 123,
"message": "<string>",
"details": [
{
"@type": "<string>"
}
]
}Authorizations
murmur API key: mur_<key_id>.
Body
Identifies an agent. The identity is (tenant, workspace, owner, agent path); the workspace scopes the agent's repos, environment, and base branches.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Optional client-generated ID for this follow-up. Use it to correlate the follow-up in status and timeline responses.
Optional JSON Schema for this follow-up's structured output. When set, it replaces the agent's active output schema for this turn and remains active for subsequent turns until changed (sticky, like the persona). Empty leaves the current schema unchanged. Validated like SpawnRequest.output_schema.
Optional model override for this and subsequent turns (e.g. "claude-opus-4-8"). When set, it replaces the agent's active model and remains active until changed (sticky, like the persona and output_schema). Empty leaves the current model unchanged. Reconciliation with the agent persona is identical to spawn: the explicit model (SpawnRequest.model there, this field here) overrides the persona's AgentConfig.model at the VM. The model must stay on the agent's backend (claude vs codex, inferred exactly as at spawn) — the backend fixes turn dispatch and which provider credentials were sealed onto the VM, so a cross-backend model is rejected with InvalidArgument.
Optional reasoning-effort override for this and subsequent turns — sticky, exactly like model. Empty leaves the active effort unchanged. Validated against the agent's backend with spawn's per-backend sets (config.ValidateReasoningEffort): claude accepts low, medium, high, xhigh, max; codex accepts none, low, medium, high, xhigh. An invalid or cross-backend value is rejected with InvalidArgument.
Optional service-tier override for this and subsequent turns — sticky, exactly like model. Empty leaves the active tier unchanged. Codex only (standard, fast, flex — config.ValidateServiceTier, spawn's set); a non-empty tier on a claude agent is rejected with InvalidArgument, mirroring SpawnRequest.service_tier.
Optional fast-mode override for this and subsequent turns — sticky, exactly like model. Absent leaves the active fast mode unchanged; present sets it (true or false), so fast mode can be switched off mid-session too. Claude's settings.json fastMode, as at spawn (SpawnRequest.fast_mode); not validated per backend, mirroring spawn.
When true, discards any pending queued follow-ups and interrupts the agent's in-flight turn before enqueuing this one — atomically, so the preempting follow-up runs next. The interrupt is best-effort: an idle agent or a turn still starting up is not cut short, but the queue is still cleared and this follow-up still runs as the next turn.
When set, defers the message until this time, then it joins the ordinary queue — waking a sleeping agent exactly like a fresh follow-up. Cancel by removing the message with QueueRemove using the returned follow_up_id. Must be strictly in the future and at most 30 days out. Mutually exclusive with preempt. Multiple deferred messages may coexist; re-arm with QueueRemove + QueueAdd. Rejected with FAILED_PRECONDITION when the target agent is on a build without deferral support.
Response
A successful response.
The message's effective follow-up ID: the request's follow_up_id when supplied (dashboard reconciliation), else a server-minted UUID. Keys QueueRemove and the timeline's QUEUED → DELIVERED/CLEARED transitions.