---
title: "Call item.trash"
method: POST
path: "/api/v1/tools/item.trash"
tags: ["item"]
---

# Call item.trash

`POST /api/v1/tools/item.trash`

## Request

- Base URL: `https://app.goosybear.ai`
- URL: `https://app.goosybear.ai/api/v1/tools/item.trash`
- Auth: HTTP bearer

Move an image, a document, an email, a post, a data table, a whole site or app, an automation, a video or short, or a widget on a desk or project (a chart, a number, a note, a link, a button) to the Trash — 'trash that sunset image', 'get rid of the draft welcome email', 'bin the post about the new menu', 'throw away the old signups table', 'we are done with the Acme landing site, bin it', 'delete the Monday report automation', 'delete the spring promo video', 'take the leads chart off my desk'. The item leaves every project and list it shows in and can be restored from the Trash for 30 days; nothing is charged. A trashed post never publishes: its scheduled versions are set aside and its place on the schedule is freed, and a post already out stays on the platform. An automation is switched off first and stays off. An email that is set to send is refused until the member sends it back to draft, and a post going out right now is refused until it has posted. A widget shown in several places can leave just one: send `from_place`, the desk or project it comes off by name, or its id as `from_project_id`, and it keeps showing in its other places. Calling it raises the approval card naming exactly the item it found, and the card is where the member checks it is the right one, so call it on the ask rather than asking which one first. Send `item_id` when a verb or the page showed you the item's id — a site's site_id, an automation's definition_id from `automations.list`, a video's video_unit_id, a widget's id from `widget.list`; otherwise send `name`, the member's words for its name, title or subject (a site the member has open needs neither). Not for a project — that is `board.trash` — nor for letting a widget come down on its own later, which is `widget.set_expiry`. Over the API it answers in two calls: without confirmation_id it proposes — says what would happen, returns a confirmation_id and changes, spends and sends nothing; the same arguments again with that confirmation_id, on a member's own API key, do it.

Every result names the workspace it ran in. Say which workspace the answer is about. When the account has more than one workspace and none is selected, this tool refuses with `workspace_ambiguous` and lists the choices — offer them, never pick one.

## Headers

- `x-request-id` string

## Request body

- object
  - `item_kind` 'image' | 'document' | 'email' | 'post' | 'table' | 'site' | 'automation' | 'video' | 'widget', required: What the item is: an image, a document, an email, a post, a data table, a whole site or app, an automation, a video (a short is a video too), or a widget on a desk or project (a chart, a number, a note on a desk, a link, a button).
  - `item_id` string, uuid: The item's id, as a UUID a verb or the page showed you; for an automation, its definition_id; for a widget, its id from `widget.list`. Leave it out when you only have the member's words for it.
  - `name` string: The member's words for the item's name, when there is no item_id.
  - `from_project_id` string, uuid: For a widget only: the project to take it off, by its id from `widget.list`. It leaves that one place and keeps showing in its others; it goes to the Trash only when that was its last place. Leave it out to send the widget to the Trash from everywhere.
  - `from_place` string: For a widget only: the desk or project to take it off, by its name as they said it ('My desk', 'Acme retainer'), in place of from_project_id. It keeps showing in its other places.
  - `confirmation_id` string, uuid: Omit to propose: the first call says what would happen, returns a confirmation_id and changes nothing. To go ahead, send the same arguments again with that confirmation_id, on a member's own API key; a service account's key can propose but never confirm.
  - `workspace` string: Which workspace to run in — its slug. Omit to use your default. With more than one reachable workspace and no default, the call is refused and the choices are listed.

## Response `200`

The call was admitted and dispatched. `ok` says whether the tool succeeded — a refusal the tool itself produced is still a 200, exactly as it is a successful JSON-RPC result over MCP.

- union
  - object: The tool ran and answered.
    - `ok` true, required
    - `state` 'confirmation_required'
    - `confirmation_id` string, uuid
    - `expires_in_seconds` integer
    - `request_summary` string: What will happen, in one sentence, for a person to approve before confirming.
    - `item_kind` 'image' | 'document' | 'email' | 'post' | 'table' | 'site' | 'automation' | 'video' | 'widget'
    - `item_id` string, uuid
    - `name` string
    - `trashed` boolean: True when it went to the Trash; false when a widget only left the one place from_project_id named.
    - `answer_note` string
    - `workspace` string, required: The slug of the workspace this call ran in.
    - `working_in` object, required: Which workspace this call ran in, and how that was decided. Present on every workspace-scoped result.
      - `label` string, required: The chip words — e.g. "working in: Acme Main".
      - `note` string, required: Why this workspace — e.g. "your default", "this call only".
      - `workspace` string, required: The resolved workspace's slug.
      - `source` 'call-override' | 'key-pin' | 'stored-default' | 'sole-reachable', required: Which rung of the R7 precedence resolved the workspace.
  - ToolRefusal: A call that was admitted and dispatched, and did not succeed.
    - `ok` false, required
    - `code` string, required: The typed reason — e.g. `workspace_ambiguous`, `invalid_arguments`, or the tool's own failure code.
    - `message` string, required: A sentence a person can act on.
    - `workspaces` string[]: On a workspace refusal: the slugs this key may pass as `workspace`.
    - `issues` object[]: On `invalid_arguments`: which fields failed, and why.
      - `path` string, required
      - `message` string, required
    - `path` string: On an authoring refusal: where in your call's input it points, e.g. `steps.<key>.params.<field>`.
    - `fix` string: On an authoring refusal: the change to your call that would pass.
    - `instruction` string: On an authoring refusal: what to do next with it.

## Other responses

- `400`: The request could not be used: the body is present but not a JSON object (`tenant_api.malformed_body`); it is a top-level array carrying more messages than this endpoint accepts (`tenant_mcp.batch_too_large`); or the `Idempotency-Key` header is malformed (`tenant_api.idempotency_key_invalid`), disagrees with the body's `idempotency_key` (`tenant_api.idempotency_key_conflict`), or was sent to an action that cannot replay a retry (`tenant_api.idempotency_unsupported`). Nothing ran.
- `401`: No bearer credential, or one that did not resolve. Deliberately ONE undifferentiated answer for absent / unknown / revoked / expired, so the endpoint is never an oracle over the key space.
- `403`: The credential is good but the surface is not open to it — the platform or account API switch is off, or the holder lacks the `api.access` capability. The `code` says which.
- `404`: No such tool. The body names no tool and is identical for every unrecognised name.
- `429`: Over this key's per-minute cap. Carries `Retry-After` and `error.retry_after_seconds`.

## Changes

- **2026-10-20** `f9b4aeb83edc`: 1 breaking, 2 warning, 4 info
  - the `trashed` response property const value `true` was removed for the status `200`
  - added the new `video` enum value to the `oneOf[subschema #1]/item_kind` response property for the response status `200`
  - added the new `widget` enum value to the `oneOf[subschema #1]/item_kind` response property for the response status `200`
  - added the new optional request property `from_place`
  - …3 more

[Operation history](https://skmtc.dev/goosybear/apis/goosy-bear-api/changes/api/v1/tools/item.trash/post.md)

---

[API](https://skmtc.dev/goosybear/apis/goosy-bear-api.md) · [All operations](https://skmtc.dev/goosybear/apis/goosy-bear-api/llms.txt) · [OpenAPI document](https://skmtc.dev/goosybear/apis/goosy-bear-api/revisions/0e033701d3f7?raw)
