Skip to content

Create a caller-owned Session idempotently

PUT
/v1/sessions/{sessionId}
curl --request PUT \
--url https://api.vampikez.fun/v1/sessions/9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "title": "Rate limit the payments endpoint", "initialTurn": { "id": "c47a1e08-3d6b-4a92-9f15-8b70d2e5c6a4", "message": "Add rate limiting to the payments endpoint and open a PR" }, "origin": { "tenantKey": "acme", "objectType": "issue", "objectId": "PAY-4821", "endUserId": "9c1f0a7d4b62e35810af2d6c95b7e043", "label": "PAY-4821 Rate limit the payments endpoint", "url": "https://acme.example.com/issues/PAY-4821" }, "source": { "kind": "github", "grantId": "74c5a903-8e6f-4b1d-a052-3c9e18d7f64b", "baseBranch": "main" }, "model": "claude-opus-5", "runtime": "wamp" }'

Optionally admits the first caller-owned Turn and its 1:1 Run atomically with the Session. Omit initialTurn only when intentionally creating an idle workspace. Repeating the same Session id and immutable body returns the existing Session; changing the body returns a conflict.

sessionId
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
Example
9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731

A UUID you mint and own; it is the idempotency key for creation and the address of every Turn, artifact and publication underneath

Media typeapplication/json

Body of the idempotent Session create. initialTurn is the ordinary one-shot path; omit it only to create an idle workspace and submit a Turn later. Repeating the same caller-owned Session id with the same body returns the existing Session and initial Run; the same id with a different body is a conflict. For native WAMP, omitting model selects the caller’s resolved agent slot default at new Session admission. A replay uses the stored model even if that default or the catalog has changed. If no agent slot is available, creation returns 400 cloud_agent_model_unavailable. A runtime-managed agent must omit the Session model. When initialTurn.runtime is set, the Session-level runtime must also be set to the same agent.

object
title

Human-facing Session name; when omitted a title is derived from initialTurn.message, or defaults to New workspace for an idle Session

string
>= 1 characters <= 160 characters
initialTurn

First caller-owned Turn to admit atomically with the Session. It may override model, runtime, and runtime-owned configuration for that immutable Turn. Its id also names the 1:1 Run. Replaying the same Session body cannot create a second Run.

object
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
message
required
string
>= 1 characters <= 100000 characters
model
string
>= 1 characters <= 128 characters
runtime
string
<= 64 characters /^[a-z0-9][a-z0-9-]*$/
thinkingLevel
string
Allowed values: none low medium high xhigh max
runtimeConfig
object
<= 16 properties
key
additional properties
string
>= 1 characters <= 256 characters
origin

Correlation metadata linking this Session to the originating record in the caller’s product

object
tenantKey
required

Stable opaque identifier for the external tenant the work belongs to, not its display name

string
>= 1 characters <= 128 characters
objectType
required

The caller’s own kind name for the originating record, such as ticket or issue

string
>= 1 characters <= 64 characters
objectId
required

The caller’s stable opaque id for that record, so a Session can always be traced back to the business object

string
>= 1 characters <= 256 characters
endUserId

Stable one-way hash of the external tenant/user pair; never raw PII.

string
>= 1 characters <= 128 characters
label

Short human-readable name for the originating record, shown when the Session is handed to a person

string
<= 256 characters
url

HTTPS deep link back to the originating record in the caller’s product

string format: uri
/^https:///
source

Repository to check out into the sandbox; a grant source pins the Session to that exact repository, branch and base commit

object
One of:
object
kind
required
Allowed value: public
url
required
string format: uri
/^https:///
label
required
string
>= 1 characters <= 512 characters
model

Optional for native WAMP: omission uses the caller’s resolved agent slot default from GET /v1/capabilities, stored on the Session and its initial Turn. Omit with a runtime-managed agent to use that runtime’s default model.

string
>= 1 characters <= 128 characters
runtime

Agent runtime id taken from /v1/capabilities, such as wamp, claude-code or codex; it settles at creation and cannot be changed once a Turn is accepted

string
<= 64 characters /^[a-z0-9][a-z0-9-]*$/
environment
One of:
object
id
required
string format: uuid
Example
{
"title": "Rate limit the payments endpoint",
"initialTurn": {
"id": "c47a1e08-3d6b-4a92-9f15-8b70d2e5c6a4",
"message": "Add rate limiting to the payments endpoint and open a PR"
},
"origin": {
"tenantKey": "acme",
"objectType": "issue",
"objectId": "PAY-4821",
"endUserId": "9c1f0a7d4b62e35810af2d6c95b7e043",
"label": "PAY-4821 Rate limit the payments endpoint",
"url": "https://acme.example.com/issues/PAY-4821"
},
"source": {
"kind": "github",
"grantId": "74c5a903-8e6f-4b1d-a052-3c9e18d7f64b",
"baseBranch": "main"
},
"model": "claude-opus-5",
"runtime": "wamp"
}

Idempotent replay

Media typeapplication/json

Atomic Session admission. The response contains the complete durable outcome of the create intent.

object
session
required

The Session as it stands after this request; a create that was an idempotent replay returns the already-stored Session unchanged

object
id
required

The caller-owned Session id, unchanged from the create request

string format: uuid
sessionUrl
required

Canonical first-party browser URL for handing this Session to a human

string format: uri
organizationId
required

Organization that owns the Session; every credential is authorized against this organization

string format: uuid
title
required

Human-facing name — the supplied title, first non-empty line of initialTurn.message, or New workspace for an idle Session

string
origin

Correlation metadata supplied at creation; absent when none was sent

object
tenantKey
required

Stable opaque identifier for the external tenant the work belongs to, not its display name

string
>= 1 characters <= 128 characters
objectType
required

The caller’s own kind name for the originating record, such as ticket or issue

string
>= 1 characters <= 64 characters
objectId
required

The caller’s stable opaque id for that record, so a Session can always be traced back to the business object

string
>= 1 characters <= 256 characters
endUserId

Stable one-way hash of the external tenant/user pair; never raw PII.

string
>= 1 characters <= 128 characters
label

Short human-readable name for the originating record, shown when the Session is handed to a person

string
<= 256 characters
url

HTTPS deep link back to the originating record in the caller’s product

string format: uri
/^https:///
source

Repository checked out into the sandbox, with the exact base the Session was pinned to; absent for a Session with no repository

object
One of:
object
kind
required
Allowed value: public
url
required
string
label
required
string
model

Model in effect for the next Turn; absent when a runtime-managed agent supplies its own default

string
runtime

The settled foreign agent runtime id, such as claude-code or codex; absent means the native WAMP runtime

string
workspace
required

Sandbox attachment — unavailable when no lease is held, attached with the lease expiresAt, expired once that lease has lapsed; losing it does not end the Session

object
state
required
string
Allowed values: unavailable attached expired
expiresAt
string format: date-time
continuation
required

Whether and at what fidelity this Session can be carried into another Run

object
canContinue
required

Whether a new Turn can be admitted for this Session — nothing more. It is NOT the answer to “did my previous work survive”: a fresh Session reports canContinue: true with both fidelities none, so a caller that branches on this field alone starts over believing it resumed. reason is the field that answers the other question, and it is present here whenever prior work will not carry. canContinue is false only while state is unavailable.

boolean
state
required

live while a sandbox lease is still held, fresh before any Run has been accepted, restorable when a sealed checkpoint can be replayed into a new sandbox, unavailable when neither is possible

string
Allowed values: live fresh restorable unavailable
conversation
required

Fidelity the conversation would be restored at — live in an attached sandbox, exact from a full checkpoint, result_only when just prior results survive, none when nothing does

object
fidelity
required
string
Allowed values: live exact result_only none
workspace
required

Fidelity the working tree would be restored at — live, portable_tree from a checkpointed tree, or none

object
fidelity
required
string
Allowed values: live portable_tree none
boundaryRunId

The Run whose completion sealed the checkpoint this projection describes; absent when no checkpoint exists

string format: uuid
reason

Why a next Turn will NOT carry this Session’s previous work. Present exactly when it will not, and absent exactly when it will — so reason == null is the one check that means “resuming here keeps what happened”. no_prior_work accompanies state: fresh and canContinue: true: the Session accepts a Turn and has nothing to carry. The other four accompany state: unavailable and canContinue: false, and name why a restore is impossible rather than merely empty.

string
Allowed values: no_prior_work checkpoint_unavailable conversation_not_restorable workspace_not_restorable session_archived
phase
required

Last execution phase the control plane recorded for this Session — a closed set, safe to switch on exhaustively, and additions arrive with a contract change. It remains advisory presentation state: the Run carries the authoritative status, and phase may lag it between a Run’s terminal transition and reconciliation.

string
Allowed values: idle provisioning running awaiting finalizing completed failed
createdBy
required

Whether a human user or an App installation created the Session, and that actor’s id; an installation-created Session keeps its App authority even when a human later manages it

object
kind
required
string
Allowed values: user app_installation
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
activeRun

Present exactly while this Session has a Run that is not terminal, awaiting included. It is set at admission, so it is already there while the Run is queued or dispatching and before the Run reaches a sandbox or writes its first event — which is the window in which a Turn is refused with 409 cloud_run_in_progress and the Event log is still empty. The one exception is a Run that has ended and is finalizing (phase: finalizing): a follow-up Turn is admitted and queued behind it, and becomes this field. This is the id to cancel, and the id to read GET /v1/sessions/{sessionId}/runs/{runId} with when you did not mint the Turn yourself.

object
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
createdAt
required

When the Session was admitted

string format: date-time
updatedAt
required

Last time durable Session state changed; the Session list is ordered by this value descending

string format: date-time
lastEventSequence
required

Sequence of the newest Event in this Session’s log, 0 before the first. Page GET /v1/sessions/{sessionId}/events only when your cursor is below it

integer
archivedAt

When the Session was archived. Present only on an archived Session — which is readable but closed: it is hidden from the default catalog page, reports continuation.canContinue false with reason session_archived, and rejects every command

string format: date-time
environment
required
One of:
object
id
required
string format: uuid
name
required
string
revision
required
integer
>= 1
initialTurn

Durable initial Turn and 1:1 Run admitted atomically with the Session. Absent only for an intentionally idle create; created is false on an exact replay.

object
turn
required

The durably admitted Turn, normally still pending dispatch at this point

object
id
required

The caller-owned Turn id; the one Run admitted with it carries this exact same value

string format: uuid
sessionId
required

Session this Turn belongs to

string format: uuid
ordinal
required

Session-local admission order starting at 0, and the value Turn paging is keyed on

integer
input
required

The immutable admitted input — the message plus whatever model, runtime and reply the caller actually requested

object
message
required
string
model
string
runtime
string
thinkingLevel
string
Allowed values: none low medium high xhigh max
runtimeConfig
object
key
additional properties
string
replyTo
object
interactionId
string
dispatch
required

Durable hand-off state to the engine: pending before a worker claims it, attempted once delivery started, confirmed when the engine accepted it, rejected when it definitively did not

string
Allowed values: pending attempted confirmed rejected
run
required

The single Run this Turn created; its id equals the Turn id

object
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
raisedBy
One of: discriminator: kind
object
kind
required
string
Allowed value: child_session
sessionId
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
createdAt
required

When admission committed the Turn, which is before any compute necessarily existed

string format: date-time
run
required

The 1:1 Run created with it, normally still queued

object
id
required

Run id, always equal to the id of the Turn that created it

string format: uuid
sessionId
required

Session this Run belongs to

string format: uuid
status
required

queued, dispatching and running are in flight, awaiting means the agent is blocked on human input, and completed, failed, cancelled and crashed are terminal

string
Allowed values: queued dispatching running awaiting completed failed cancelled crashed
attempts
required

How many times a worker has claimed this Run; recovery after a lost worker increments it instead of creating a second Run

integer
cancellationRequested
required

Whether cancellation was durably requested; it stays true after the Run terminates, and it never asserts that an external side effect was undone

boolean
lastError

Coarse machine code for the most recent failure, retained across retries; absent when nothing has failed. This is the whole declared vocabulary: a failure with no code of its own is recorded as dispatch_failed rather than as an undeclared value. Read status first — this field is present on a queued Run that is still retrying, where it names why the last attempt did not place, and the placement and cancellation codes appear there and never on an event. Treat the set as additive and tolerate a value you do not recognize.

object
code
required
string
Allowed values: authorization_unavailable authorization_rejected authority_revoked_cancel authority_revoked_dispatch dispatch_attempts_exhausted dispatch_failed runtime_account_unavailable turn_execution_lost interaction_conflict agent_locked resume_unavailable runtime_outdated environment_setup_failed environment_forbidden compute_outdated compute_not_configured workspace_unavailable workspace_expired conversation_busy repository_grant_required session_not_found turn_not_found cancel_not_observed cancel_authority_revoked upstream_429 upstream_5xx upstream_4xx upstream_timeout upstream_network stream_incomplete refused_invalid_request refused_unsupported_parameter refused_unsupported_tool_type refused_invalid_tool_arguments refused_model_not_found refused_end_user_id_conflict refused_invalid_end_user_id refused_too_many_concurrent refused_service_unavailable refused_missing_api_key refused_invalid_api_key refused_malformed_request_body refused_request_entity_too_large context_overflow model_no_tools tool_loop_limit repeated_tool_failure response_limit budget_exhausted runtime_error unknown
createdAt
required

When admission committed this Run in queued

string format: date-time
updatedAt
required

Last durable Run state change

string format: date-time
startedAt

When a worker actually began executing; absent while the Run is still queued

string format: date-time
completedAt

When the Run reached a terminal status; absent otherwise

string format: date-time
created
required

False when this request was an exact idempotent replay and the stored Turn was returned unchanged

boolean
Example
{
"session": {
"id": "9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731",
"sessionUrl": "https://cloud.wamp.dev/sessions/9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731",
"organizationId": "0b9a6f3e-5c21-4d78-9e64-8f1a2b7c3d05",
"title": "Rate limit the payments endpoint",
"origin": {
"tenantKey": "acme",
"objectType": "issue",
"objectId": "PAY-4821",
"endUserId": "9c1f0a7d4b62e35810af2d6c95b7e043",
"label": "PAY-4821 Rate limit the payments endpoint",
"url": "https://acme.example.com/issues/PAY-4821"
},
"source": {
"kind": "github",
"grantId": "74c5a903-8e6f-4b1d-a052-3c9e18d7f64b",
"label": "acme/checkout-service",
"private": true,
"baseBranch": "main",
"baseOid": "5a3e170c93eda8209e3f5592fe1e1d9976fe26ab"
},
"model": "claude-opus-5",
"runtime": "wamp",
"workspace": {
"state": "attached",
"expiresAt": "2026-08-12T11:40:00Z"
},
"continuation": {
"canContinue": true,
"state": "live",
"conversation": {
"fidelity": "live"
},
"workspace": {
"fidelity": "live"
}
},
"phase": "running",
"createdBy": {
"kind": "app_installation",
"id": "e3f7b219-6c40-4a8e-b591-07d2c48f3a65"
},
"activeRun": {
"id": "c47a1e08-3d6b-4a92-9f15-8b70d2e5c6a4"
},
"createdAt": "2026-08-12T09:20:14Z",
"updatedAt": "2026-08-12T09:41:02Z",
"lastEventSequence": 37,
"environment": null,
"parent": null
}
}

Session created

Media typeapplication/json

Atomic Session admission. The response contains the complete durable outcome of the create intent.

object
session
required

The Session as it stands after this request; a create that was an idempotent replay returns the already-stored Session unchanged

object
id
required

The caller-owned Session id, unchanged from the create request

string format: uuid
sessionUrl
required

Canonical first-party browser URL for handing this Session to a human

string format: uri
organizationId
required

Organization that owns the Session; every credential is authorized against this organization

string format: uuid
title
required

Human-facing name — the supplied title, first non-empty line of initialTurn.message, or New workspace for an idle Session

string
origin

Correlation metadata supplied at creation; absent when none was sent

object
tenantKey
required

Stable opaque identifier for the external tenant the work belongs to, not its display name

string
>= 1 characters <= 128 characters
objectType
required

The caller’s own kind name for the originating record, such as ticket or issue

string
>= 1 characters <= 64 characters
objectId
required

The caller’s stable opaque id for that record, so a Session can always be traced back to the business object

string
>= 1 characters <= 256 characters
endUserId

Stable one-way hash of the external tenant/user pair; never raw PII.

string
>= 1 characters <= 128 characters
label

Short human-readable name for the originating record, shown when the Session is handed to a person

string
<= 256 characters
url

HTTPS deep link back to the originating record in the caller’s product

string format: uri
/^https:///
source

Repository checked out into the sandbox, with the exact base the Session was pinned to; absent for a Session with no repository

object
One of:
object
kind
required
Allowed value: public
url
required
string
label
required
string
model

Model in effect for the next Turn; absent when a runtime-managed agent supplies its own default

string
runtime

The settled foreign agent runtime id, such as claude-code or codex; absent means the native WAMP runtime

string
workspace
required

Sandbox attachment — unavailable when no lease is held, attached with the lease expiresAt, expired once that lease has lapsed; losing it does not end the Session

object
state
required
string
Allowed values: unavailable attached expired
expiresAt
string format: date-time
continuation
required

Whether and at what fidelity this Session can be carried into another Run

object
canContinue
required

Whether a new Turn can be admitted for this Session — nothing more. It is NOT the answer to “did my previous work survive”: a fresh Session reports canContinue: true with both fidelities none, so a caller that branches on this field alone starts over believing it resumed. reason is the field that answers the other question, and it is present here whenever prior work will not carry. canContinue is false only while state is unavailable.

boolean
state
required

live while a sandbox lease is still held, fresh before any Run has been accepted, restorable when a sealed checkpoint can be replayed into a new sandbox, unavailable when neither is possible

string
Allowed values: live fresh restorable unavailable
conversation
required

Fidelity the conversation would be restored at — live in an attached sandbox, exact from a full checkpoint, result_only when just prior results survive, none when nothing does

object
fidelity
required
string
Allowed values: live exact result_only none
workspace
required

Fidelity the working tree would be restored at — live, portable_tree from a checkpointed tree, or none

object
fidelity
required
string
Allowed values: live portable_tree none
boundaryRunId

The Run whose completion sealed the checkpoint this projection describes; absent when no checkpoint exists

string format: uuid
reason

Why a next Turn will NOT carry this Session’s previous work. Present exactly when it will not, and absent exactly when it will — so reason == null is the one check that means “resuming here keeps what happened”. no_prior_work accompanies state: fresh and canContinue: true: the Session accepts a Turn and has nothing to carry. The other four accompany state: unavailable and canContinue: false, and name why a restore is impossible rather than merely empty.

string
Allowed values: no_prior_work checkpoint_unavailable conversation_not_restorable workspace_not_restorable session_archived
phase
required

Last execution phase the control plane recorded for this Session — a closed set, safe to switch on exhaustively, and additions arrive with a contract change. It remains advisory presentation state: the Run carries the authoritative status, and phase may lag it between a Run’s terminal transition and reconciliation.

string
Allowed values: idle provisioning running awaiting finalizing completed failed
createdBy
required

Whether a human user or an App installation created the Session, and that actor’s id; an installation-created Session keeps its App authority even when a human later manages it

object
kind
required
string
Allowed values: user app_installation
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
activeRun

Present exactly while this Session has a Run that is not terminal, awaiting included. It is set at admission, so it is already there while the Run is queued or dispatching and before the Run reaches a sandbox or writes its first event — which is the window in which a Turn is refused with 409 cloud_run_in_progress and the Event log is still empty. The one exception is a Run that has ended and is finalizing (phase: finalizing): a follow-up Turn is admitted and queued behind it, and becomes this field. This is the id to cancel, and the id to read GET /v1/sessions/{sessionId}/runs/{runId} with when you did not mint the Turn yourself.

object
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
createdAt
required

When the Session was admitted

string format: date-time
updatedAt
required

Last time durable Session state changed; the Session list is ordered by this value descending

string format: date-time
lastEventSequence
required

Sequence of the newest Event in this Session’s log, 0 before the first. Page GET /v1/sessions/{sessionId}/events only when your cursor is below it

integer
archivedAt

When the Session was archived. Present only on an archived Session — which is readable but closed: it is hidden from the default catalog page, reports continuation.canContinue false with reason session_archived, and rejects every command

string format: date-time
environment
required
One of:
object
id
required
string format: uuid
name
required
string
revision
required
integer
>= 1
initialTurn

Durable initial Turn and 1:1 Run admitted atomically with the Session. Absent only for an intentionally idle create; created is false on an exact replay.

object
turn
required

The durably admitted Turn, normally still pending dispatch at this point

object
id
required

The caller-owned Turn id; the one Run admitted with it carries this exact same value

string format: uuid
sessionId
required

Session this Turn belongs to

string format: uuid
ordinal
required

Session-local admission order starting at 0, and the value Turn paging is keyed on

integer
input
required

The immutable admitted input — the message plus whatever model, runtime and reply the caller actually requested

object
message
required
string
model
string
runtime
string
thinkingLevel
string
Allowed values: none low medium high xhigh max
runtimeConfig
object
key
additional properties
string
replyTo
object
interactionId
string
dispatch
required

Durable hand-off state to the engine: pending before a worker claims it, attempted once delivery started, confirmed when the engine accepted it, rejected when it definitively did not

string
Allowed values: pending attempted confirmed rejected
run
required

The single Run this Turn created; its id equals the Turn id

object
id
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
raisedBy
One of: discriminator: kind
object
kind
required
string
Allowed value: child_session
sessionId
required

A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.

string format: uuid
createdAt
required

When admission committed the Turn, which is before any compute necessarily existed

string format: date-time
run
required

The 1:1 Run created with it, normally still queued

object
id
required

Run id, always equal to the id of the Turn that created it

string format: uuid
sessionId
required

Session this Run belongs to

string format: uuid
status
required

queued, dispatching and running are in flight, awaiting means the agent is blocked on human input, and completed, failed, cancelled and crashed are terminal

string
Allowed values: queued dispatching running awaiting completed failed cancelled crashed
attempts
required

How many times a worker has claimed this Run; recovery after a lost worker increments it instead of creating a second Run

integer
cancellationRequested
required

Whether cancellation was durably requested; it stays true after the Run terminates, and it never asserts that an external side effect was undone

boolean
lastError

Coarse machine code for the most recent failure, retained across retries; absent when nothing has failed. This is the whole declared vocabulary: a failure with no code of its own is recorded as dispatch_failed rather than as an undeclared value. Read status first — this field is present on a queued Run that is still retrying, where it names why the last attempt did not place, and the placement and cancellation codes appear there and never on an event. Treat the set as additive and tolerate a value you do not recognize.

object
code
required
string
Allowed values: authorization_unavailable authorization_rejected authority_revoked_cancel authority_revoked_dispatch dispatch_attempts_exhausted dispatch_failed runtime_account_unavailable turn_execution_lost interaction_conflict agent_locked resume_unavailable runtime_outdated environment_setup_failed environment_forbidden compute_outdated compute_not_configured workspace_unavailable workspace_expired conversation_busy repository_grant_required session_not_found turn_not_found cancel_not_observed cancel_authority_revoked upstream_429 upstream_5xx upstream_4xx upstream_timeout upstream_network stream_incomplete refused_invalid_request refused_unsupported_parameter refused_unsupported_tool_type refused_invalid_tool_arguments refused_model_not_found refused_end_user_id_conflict refused_invalid_end_user_id refused_too_many_concurrent refused_service_unavailable refused_missing_api_key refused_invalid_api_key refused_malformed_request_body refused_request_entity_too_large context_overflow model_no_tools tool_loop_limit repeated_tool_failure response_limit budget_exhausted runtime_error unknown
createdAt
required

When admission committed this Run in queued

string format: date-time
updatedAt
required

Last durable Run state change

string format: date-time
startedAt

When a worker actually began executing; absent while the Run is still queued

string format: date-time
completedAt

When the Run reached a terminal status; absent otherwise

string format: date-time
created
required

False when this request was an exact idempotent replay and the stored Turn was returned unchanged

boolean
Example
{
"session": {
"id": "9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731",
"sessionUrl": "https://cloud.wamp.dev/sessions/9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731",
"organizationId": "0b9a6f3e-5c21-4d78-9e64-8f1a2b7c3d05",
"title": "Rate limit the payments endpoint",
"origin": {
"tenantKey": "acme",
"objectType": "issue",
"objectId": "PAY-4821",
"endUserId": "9c1f0a7d4b62e35810af2d6c95b7e043",
"label": "PAY-4821 Rate limit the payments endpoint",
"url": "https://acme.example.com/issues/PAY-4821"
},
"source": {
"kind": "github",
"grantId": "74c5a903-8e6f-4b1d-a052-3c9e18d7f64b",
"label": "acme/checkout-service",
"private": true,
"baseBranch": "main",
"baseOid": "5a3e170c93eda8209e3f5592fe1e1d9976fe26ab"
},
"model": "claude-opus-5",
"runtime": "wamp",
"workspace": {
"state": "unavailable"
},
"continuation": {
"canContinue": true,
"state": "fresh",
"conversation": {
"fidelity": "none"
},
"workspace": {
"fidelity": "none"
}
},
"phase": "idle",
"createdBy": {
"kind": "app_installation",
"id": "e3f7b219-6c40-4a8e-b591-07d2c48f3a65"
},
"createdAt": "2026-08-12T09:20:14Z",
"updatedAt": "2026-08-12T09:20:14Z",
"lastEventSequence": 11,
"environment": null,
"parent": null
}
}
Location
string

Malformed request

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "invalid_request"
}

No bearer was presented (bearer_credential_required), or the one presented is expired, revoked or for another audience (invalid_or_expired_credential)

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "bearer_credential_required"
}

Live installation, scope or organization policy denies the operation

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "insufficient_scope",
"requiredScope": "wamp.cloud.sessions:create"
}

Idempotency, lifecycle, revision or single-flight conflict

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "cloud_session_conflict"
}

The request body was never read. Either the Content-Type is not a JSON media type — bodies are parsed only under application/json and RFC 6839 application/*+json — or its content encoding or charset was refused. unsupported_media_type echoes the type you sent in mediaType. Malformed JSON under an accepted media type is a different answer: 400 malformed_request_body.

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "unsupported_media_type",
"mediaType": "application/x-www-form-urlencoded"
}

The pre-authentication edge budget or durable human-membership/App-installation budget is exhausted

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "cloud_rate_limit_exceeded",
"retryAfterSeconds": 3
}
Retry-After
integer
>= 1
RateLimit-Policy
string

IETF HTTPAPI structured quota policy

RateLimit
string

IETF HTTPAPI structured current service limit

The request was accepted and something on our side failed while answering it. Nothing about the request needs to change; the same call may succeed on retry. Retry cautiously, with backoff — a non-idempotent command may have taken effect before the fault.

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "internal_error"
}

A retryable condition: a workspace, runtime or provider that is not available yet, or service_unavailable while the service restarts for a release or its database cannot serve the request in time. Retry after the Retry-After this response carries.

Media typeapplication/json

Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.

object
error
required

Stable machine code

string
requiredScope

The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request

string
retryAfterSeconds

Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value

integer
>= 1
issues

Returned with invalid_request: one entry per field of the request body or query that was refused. The WAMP Account API sends the same two keys under the same field name, and no others are sent by either.

Array<object>
object
path
required

Field path, outermost segment first. An integer segment is an array index.

Array<string | integer>
message
required

Short reason the field was refused. Prose for a human to read; branch on the code and the path, never on this.

string
parameter

Returned with invalid_path_parameter: the name of the path segment that is not a valid id, such as sessionId or artifactId

string
mediaType

Returned with unsupported_media_type: the Content-Type you sent, echoed back. Omitted when the request carried a body and no Content-Type at all, which is the same refusal. Request bodies are read only under application/json and RFC 6839 application/*+json; anything else is never parsed, so no field of it was ever seen.

string
allow

Returned with method_not_allowed: the methods this path does answer, the same list as the Allow header on the response. Read the header if you want one code path for every 405 on the API.

Array<string>
outcome

The winning approval decision on 409 cloud_interaction_conflict, when an answer exists; absent for a closed or expired request without an answer

object
interactionId
required
string
>= 1 characters <= 255 characters
choice
required
string
Allowed values: allow_once allow_turn allow_chat deny
status
required
string
Allowed values: open resolved expired
resolution
required
string | null
key
additional properties
any
Example
{
"error": "cloud_workspace_unavailable"
}
Retry-After
integer