> Source: https://wexa.ai/docs/automation/delete-schedule

# delete-schedule

[Can be held for approval](/docs/sdks-and-apis/how-every-tool-call-works#lifecycle-and-governance)

Cancel and remove a schedule by its `schedule_id`. Needs the `fabric:orchestrate.write` grant.

**Delete a schedule**

**Wexa MCP server**

```bash
curl -sS -X POST https://fabric.wexa.ai/mcp/$FABRIC_PROJECT_ID \
  -H "authorization: Bearer $FABRIC_API_KEY" \
  -H "Mcp-Session-Id: $MCP_SESSION_ID" \
  -H "content-type: application/json" -H "accept: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"delete-schedule","arguments":{"schedule_id":"6ab196817566f41b5c28e341"}}}'
```

```json
{
  "content": [
    {
      "type": "text",
      "text": "{\"lifecycle_id\":\"qlc_000212\",\"result\":{\"deleted\":true,\"schedule_id\":\"6ab196817566f41b5c28e341\"}}"
    }
  ],
  "isError": false
}
```

**REST API**

```bash
curl -sS https://fabric.wexa.ai/v1/delete-schedule \
  -H "authorization: Bearer $FABRIC_API_KEY" \
  -H "content-type: application/json" \
  -d '{"schedule_id":"6ab196817566f41b5c28e341"}'
```

```json
{
  "lifecycle_id": "qlc_000212",
  "result": {
    "deleted": true,
    "schedule_id": "6ab196817566f41b5c28e341"
  }
}
```

**TypeScript SDK**

```ts
import { Fabric } from '@wexa-fabric/sdk'

const fabric = new Fabric()
const result = await fabric.deleteSchedule({
  schedule_id: '6ab196817566f41b5c28e341'
})
```

```ts
// result is the payload itself, with no `.result` to read
{
  deleted: true,
  schedule_id: '6ab196817566f41b5c28e341'
}
```

**Python SDK**

```python
from wexa import Fabric

fabric = Fabric()
out = fabric.delete_schedule(
    schedule_id="6ab196817566f41b5c28e341",
)
```

```python
# out is the result, already unwrapped
{
    "deleted": True,
    "schedule_id": "6ab196817566f41b5c28e341"
}
```

## Parameters

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| `schedule_id` | string | Required | Schedule id from `list-schedules`. A schedule in this project. |

**Show full response**

A real response, captured from a live call to `delete-schedule`:

**Result of delete-schedule**

**REST API**

```json
{
  "lifecycle_id": "qlc_000212",
  "result": {
    "deleted": true,
    "schedule_id": "6ab196817566f41b5c28e341"
  }
}
```

**TypeScript SDK**

```ts
// the object you get back IS the result — there is no `.result` to read
{
  deleted: true,
  schedule_id: '6ab196817566f41b5c28e341'
}

// The TS SDK names these camelCase — lifecycleId, traceId — where Python uses
// lifecycle_id and trace_id. Both are non-enumerable: readable, but omitted by
// Object.keys() and JSON.stringify(). `result.lifecycleId` here is undefined.
result.lifecycleId // 'qlc_000212'
```

**Python SDK**

```python
# a dict subclass; `result` is already unwrapped
{
 "deleted": True,
 "schedule_id": "6ab196817566f41b5c28e341"
}

out.lifecycle_id  # 'qlc_000212' — an attribute, not a key
```

**More details**

A schedule that has already executed cannot be removed. The backend asks you to mark it inactive with `update-schedule` instead.

Marked consequential: it is audited in full, and a policy rule may hold it for a person to approve. See [Policy and approvals](/docs/governance/policy-and-approvals).

Every tool call works the same way: [How every tool call works](/docs/sdks-and-apis/how-every-tool-call-works).
