Skip to content

Sessions & State

Sessions

Maintain state across multiple requests

Sessions#

Sessions let agents maintain state across multiple requests โ€” useful for carts, multi-step workflows, and personalization. Surf includes an in-memory session store out of the box.

TypeScript
// Agent starts a session
POST /surf/session/start
// => { "ok": true, "sessionId": "sess_abc123" }
ย 
// Execute commands with session context
POST /surf/execute
{
"command": "cart.add",
"params": { "sku": "LAPTOP-01" },
"sessionId": "sess_abc123"
}
ย 
// The handler receives session state in ctx.state
const surf = await createSurf({
name: 'My Store',
commands: {
'cart.add': {
description: 'Add item to cart',
params: { sku: { type: 'string', required: true } },
run: async ({ sku }, ctx) => {
const cart = (ctx.state?.cart as string[]) ?? []
cart.push(sku)
// Return state to persist it
return { cart, added: sku }
},
},
'cart.view': {
description: 'View cart',
run: async (_, ctx) => {
return { items: ctx.state?.cart ?? [] }
},
},
},
})
ย 
// End session when done
POST /surf/session/end
{ "sessionId": "sess_abc123" }

Session state is automatically persisted between requests when a sessionId is provided and the response includes state.